从 C# SONAR 分析中排除生成的代码

Exclude Generated Code from C# SONAR Analysis

所以在 VS2013 中我们有一个选项“抑制生成代码的结果(仅限托管)

我们在通过 SONAR 执行分析时是否有类似的选项?

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

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

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

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

如果我们仔细查看,排除包含以下部分:

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

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

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 中,无论您是否检查项目中的 "Suppress Results from generated Code(Managed only)",您都不应该看到 CA1305 的问题。