我想使用fxcop申请自己的声纳自定义规则。
SonarScan成功使用MSBuild,但是声纳法并没有反映出规则!

我引用了此网址-https://github.com/DanielHWe/sonar-fxcop

我尝试了很多次。如果您对此问题有经验,请提出一些建议。


我的开发环境


Visual Studio 2017

MSBuild 15

Sonarqube 6.7.7

用于MSBuild 4.6.2的SonarScanner

FxCop插件1.4.1

C#插件(声纳)7.15

首先,我在下面设置了声纳服务器:


我将sonarqube 6.7.7设置为localhost
我已添加到fxcop插件1.4(https://community.sonarsource.com/t/new-release-fxcop-plugin-version-1-4/1430
我在声纳质量配置文件上创建了fxcop自定义规则模板


我写在下面

名称:SampleCustomRule

密钥:SampleCustomRule

说明:SampleCustomRule

CheckId:SK100


我根据声纳法则激活了该规则


其次,我在下面创建了示例fxcop自定义规则(Visual Studio):

我引用了此视频。(https://www.youtube.com/watch?v=arHybNYWj04


创建类库
添加引用(FxCopSdk,Microsoft.Cci)
创建示例规则.cs和rules.xml
创建签名文件(.pfx)
建立项目
将我的Assembly(.dll)复制到C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Team Tools \ Static Analysis Tools \ FxCop \ Rules


第三,我执行了MSBuild(SonarScanner)


以管理员身份运行(VS 2019开发人员命令提示符)
我在下面输入命令


SonarScanner.MSBuild.exe开始/ k:“ ConsoleApp10” / n:“ ConsoleApp10” /v:"3.6“ /d:"sonar.cs.fxcop.assembly=C:\Users\ezcare\Desktop\FxCopTest\FxCopTest\bin \ Debug \ FxCopTest.dll“ /d:"sonar.cs.fxcop.fxCopCmdPath=C:\Program Files(x86)\ Microsoft Visual Studio 12.0 \ Team Tools \ Static Analysis Tools \ FxCop \ FxCopCmd.exe” / d:“ sonar.cs.fxcop.directory = C:\ Users \ ezcare \ Desktop \ FxCopTest \ FxCopTest \ bin \ Debug“

MSBuild.exe C:\ Users \ ezcare \ source \ repos \ ConsoleApp10 / t:重建

SonarScanner.MSBuild.exe结束


结果成功。


我检查了作为我的自定义规则检查的项目,但是没有任何代码味道或其他东西。

以下是我的自定义规则代码(.cs和.xml)

using Microsoft.FxCop.Sdk;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

[assembly: CLSCompliant(true)]
namespace FxCopTest
{
    public class SampleCustomRule : BaseIntrospectionRule
    {
        public SampleCustomRule():
        base(@"SampleCustomRule", "FxCopTest.Rules", typeof(SampleCustomRule).Assembly)
        {

        }
        public override ProblemCollection Check(TypeNode type)
        {
            if(!type.Namespace.Name.StartsWith("SK", StringComparison.Ordinal))
            {
                var resolution = GetResolution(type.Name.Name);
                var problem = new Problem(resolution, type)
                {
                    Certainty = 100
                    //FixCategory = FixCategories.NonBreaking,
                    //MessageLevel = MessageLevel.Warning
                };
                base.Problems.Add(problem);

            }
            return base.Problems;
        }
    }
}


<?xml version="1.0" encoding="utf-8" ?>
<Rules>
  <Rule TypeName="SampleCustomRule" Category="CustomRules.Naming" CheckId="SK100">
    <Name>All type namespace should start with 'SK'</Name>
    <Description>SK</Description>
    <Resolution>The name of type {0} should start 'SK'</Resolution>
    <MessageLevel Certainty="100">Warning</MessageLevel>
    <FixCategories>NonBreaking</FixCategories>
    <Url/>
  </Rule>
</Rules>

最佳答案

我不建议使用FxCop为C#或VB.NET编写新规则,特别是如果您要将问题导入SonarQube。

首先,几年前FxCop被功能更强大,更易于使用的Roslyn框架所取代。在Roslyn中编写自定义规则比较简单,网络上有很多资源可以帮助您,例如Getting Started with Roslyn Analyzers(如果您设法在FxCop中编写了一个自定义规则,那么使用Roslyn编写一个自定义规则就没有问题了!)。

其次,SonarQube和MSBuild扫描仪提供了开箱即用的支持,可将定制的Roslyn分析仪中的问题作为“外部问题”导入。基本上,这意味着如果将新的Roslyn分析规则打包为NuGet包,然后在要分析的项目中引用该NuGet包,则MSBuild扫描程序会自动将问题上传到SonarQube。

但是,外部问题具有SonarQube documentation中所述的一些限制-您无法在质量配置文件中配置要执行的规则,不能在UI中将问题标记为误报等,并且您有责任将自定义的Roslyn分析器NuGet包添加到要分析的所有MSBuild项目中。

为了解决所有这些限制,您可以使用SonarQube Roslyn SDK生成一个自定义的SonarQube插件jar,它将您的自定义Roslyn分析仪打包。您无需编写任何代码。只需对您的Roslyn NuGet包运行RoslynSonarQubePluginGenerator.exe,它将创建一个插件jar。

将生成的自定义SonarQube插件安装到SonarQube实例后,您将能够在质量配置文件中配置规则,将问题标记为FP等,并且MSBuild扫描仪将负责执行分析规则作为构建的一部分因此,您无需从要分析的每个MSBuild项目中引用自定义的Roslyn分析仪NuGet程序包。

09-10 08:28
查看更多