我想使用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程序包。