我有一个包含几个C#6.0项目的.NET解决方案。每个项目都引用StyleCop Analyzer via NuGet。在Visual Studio中,我可以区分构建和分析代码,但是我看不到如何在命令行上(例如CI服务器上)使用MSBuild v14.0来做到这一点。我正在使用以下选项调用msbuild mySolution.sln /t:Rebuild,但没有一个起作用:

  • /p:RunCodeAnalysis=False
  • /p:RunCodeAnalysisOnThisProject=False
  • /p:RunCodeAnalysis=False,RunCodeAnalysisOnThisProject=False

  • 无论我做什么,警告SAxxxx都会保留在输出中。有谁知道如何在使用MSBuild时禁用代码分析?

    背景:在我们的CI服务器上,我想区分“基本MSBuild警告”和来自静态代码分析的警告。

    问候

    最佳答案



    在生成服务器TFSBuild.proj中定义的RunCodeAnalysis设置与本地MSBuild项目架构选项有很大不同。

    构建服务器支持RunCodeAnalysis的“ Always,Default,Never ”值。相反,本地MSBuild对RunCodeAnalysis支持“ True或False ”。

    您可以检查Microsoft.TeamFoundation.Build.targets文件的部分:

    <Target Name="CoreCompileSolution">
     
      <PropertyGroup>
        <CodeAnalysisOption Condition=" '$(RunCodeAnalysis)'=='Always'">RunCodeAnalysis=true</CodeAnalysisOption>
        <CodeAnalysisOption Condition=" '$(RunCodeAnalysis)'=='Never'">RunCodeAnalysis=false</CodeAnalysisOption>
        <!-- ... -->
      </PropertyGroup>
      <!-- ... -->
    </Target>
    

    由此我们可以推断出“默认”设置没有为运行时提供值,而“始终”和“从不”分别映射为True / False。

    在构建服务器上:
    Always告诉MSBuild使用RunCodeAnalysis = True编译所有项目
    Never告诉MSBuild在所有项目上取消代码分析(RunCodeAnalysis = False)。

    因此,RunCodeAnalysis的值为Default,Always,NeverTrue,False,具体取决于您的构建方式。

    您可以引用How to: Edit a Build TypeCodeAnalysis, FxCop and Team Build以获得更详细的信息。

    更新:
    根据mu88回答,我已经使用RunCodeAnalysis=False在Jenkins上创建了一个测试演示,代码分析已按预期禁用。以下是我在Jenkins上的配置:

    c# - 使用MSBuild 14时禁用代码分析-LMLPHP

    此外,您还可以检查构建日志中是否有从“Running Code Analysis...”到“Code Analysis Complete”的部分
    并且对于警告SAxxxx仍保留在输出中,这不是代码分析结果。您可以在Visual Studio上对其进行测试,而无需进行代码分析。安装软件包StyleCop.Analyzers,然后构建项目后,您将收到这些警告。

    因此,在使用参数Running Code Analysis...构建项目之后,请仔细检查Jenkins上的构建日志是否包含“Code Analysis Complete”和“:/p:RunCodeAnalysis=False”部分。

    Update2:

    如果要禁止显示StyleCop警告,可以通过在.cs文件顶部添加以下 header 来欺骗StyleCop根本不处理文件:
    //------------------------------------------------------------------------------
    // <auto-generated>
    // Well, not really. This is just a trick to get StyleCop off my back.
    // </auto-generated>
    //------------------------------------------------------------------------------
    

    07-25 23:34