2015-09-04 20 views
5

所以在VS2013我们有一个选项“从生成的代码(仅托管)禁止结果排除C#SONAR分析生成的代码

做通过SONAR进行分析时,我们有一个类似的选项?

当上述选项未选中时,下面的代码报告违规,但在SONAR中看不到任何选项可使用上述选项。 我确实尝试了Sonar.dotnet.excludeGeneratedCode = true选项,但似乎没有任何区别。

public IEnumerable<string> YieldTest() 
    { 
     foreach(var num in Enumerable.Range(100, 100)) 
      yield return string.Format("{0}", num); 
    } 
+0

分析仪如何知道它应该从分析中排除该方法?你是否用一些特殊的属性标记了它,是在一个特定的文件中,还是在特殊的项目类型中? –

+0

嗨Dinesh,我试着用[GeneratedCode]属性标记方法,但它没有帮助。 – PankajH

+0

如果您在Visual Studio中分析上述方法并取消选中上述选项,则会得到CA1305的违规问题,并且选中时不会违规。 – PankajH

回答

2

MSBuild SonarQube Runner(至少在版本1.0和1.0.1中)始终强制在生成过程中启动FxCop时检查“生成代码的抑制结果(仅限管理)”标志。见SonarQube.Integration.targets#L342

您可以在构建日志验证此行为,通过看在RunCodeAnalysis:阶段推出的命令:

RunCodeAnalysis: 
    Running Code Analysis... 
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\FxCop\FxCopCmd.exe 
    /outputCulture:1033 
    /out:"bin\Debug\ConsoleApplication1.exe.CodeAnalysisLog.xml" /file:"bin\Debug\ConsoleApplication1.exe" /ruleSet:"=C:\Users\dinesh\Desktop\tmp\ConsoleApplication1\.sonarqube\conf\\SonarQubeFxCop-cs.ruleset" 
    [... references ...] 
    /rulesetdirectory:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\\Rule Sets" 
    /rule:"-C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\FxCop\\Rules" 
    /searchgac /ignoreinvalidtargets /forceoutput /successfile **/ignoregeneratedcode** /saveMessagesToReport:Active /timeout:120 /reportMissingIndirectAssemblies 

您应该看到/ignoregeneratedcode传递给FxCopCmd.exe。

现在,只有FxCop规则将被该标志抑制。例如,StyleCop和ReSharper规则不会理解此标志,并且仍会报告该方法。

仅供参考,由于存在yield语句,似乎FxCop排除了此方法:C#编译器为此语句在程序集中生成相当复杂的IL代码。 FxCop分析程序集(而不是源代码),这就是为什么它必须将yield语句视为生成的代码。

因此,在SonarQube中,无论您是否在项目中选中了“抑制生成代码的结果(仅管理)”,您都不会看到CA1305的问题。

+0

嗨Dinesh,我只是检查日志和FxCop被调用只是“/ forceoutput/searchgac”标志,我没有看到/ ignoregeneratedcode :(。我必须做任何配置更改为SONAR,使此标志有效? – PankajH

+0

正如您在MSBuild SonarQube Runner资源中看到的那样,它确实试图强制这个标志为'true'。我可以想象的是,其他一些定制目标将在稍后再次设置为'false'。把这个方法放在一个新的控制台应用程序项目中(使用默认的.csproj文件)?如果这样做没有帮助,你可以尝试从另一台机器运行分析吗?你还可以提供你正在使用构建项目的MSBuild版本吗?我们正在密集测试12&14。 –

+0

我正在尝试使用MsBuild Runner,请更新您。谢谢 – PankajH

0

我用这个属性集运行,它排除了生成的代码。

sonar.exclusions=**/*.Tests/**,**/*Language.Designer.cs,**/*.generated.cs 

如果我们看看细节,排除包含以下几个部分:

  • /*.Tests/ ==>排除与.Tests(递归)结尾的文件夹中找到的所有代码
  • **/* Language.Designer.cs ==>排除所有资源ID文件
  • **/*。generated.cs ==>排除所有文件.generated.cs结束

如果您使用其他生成的文件(如winforms设计器文件),您将需要问自己的口罩。

+0

我Filip,我试过这种方法,但它似乎并没有工作。 – PankajH