15

我有一个包含多个 C# 6.0 项目的 .NET 解决方案。每个项目都通过 NuGet 引用 StyleCop 分析器。在 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 警告”和来自静态代码分析的警告。

问候

4

3 回答 3

8

任何人都知道如何在使用 MSBuild 时禁用代码分析?

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

构建服务器支持RunCodeAnalysis的“ Always, Default, Never ”值。相比之下,本地 MSBuild 支持 RunCodeAnalysis 的“ True or 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,具体取决于您的构建方式。

您可以参考如何:编辑构建类型代码分析、FxCop 和团队构建以获取更详细的信息。

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

在此处输入图像描述

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

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

更新2:

如果您想禁止 StyleCop 警告,您可以通过在 .cs 文件顶部添加此标头来欺骗 StyleCop 根本不处理文件:

//------------------------------------------------------------------------------
// <auto-generated>
// Well, not really. This is just a trick to get StyleCop off my back.
// </auto-generated>
//------------------------------------------------------------------------------
于 2017-05-01T03:07:55.030 回答
8

它并不真正受支持,但有一个解决方法:

在解决方案根文件夹中创建Directory.Build.targets(msbuild >= v15.0), (msbuild < 15.0) 文件并添加:After.{SolutionName}.sln.targets

<Project>
  <Target Name="DisableAnalyzers" 
           BeforeTargets="CoreCompile" 
           Condition="'$(UseRoslynAnalyzers)' == 'false'"> 
    <!-- 
       Disable analyzers via an MSBuild property settable on the command line. 
    --> 
    <ItemGroup> 
      <Analyzer Remove="@(Analyzer)" /> 
    </ItemGroup> 
  </Target> 
</Project>

您现在可以传入/p:UseRoslynAnalyzers=false以删除项目中配置的所有分析器。

也可以看看:

您可以编辑条件以在RunCodeAnalysis=False或上也触发Never

<Target Name="DisableAnalyzers" 
        BeforeTargets="CoreCompile" 
        Condition="
           '$(UseRoslynAnalyzers)' == 'false' 
           or '$(RunCodeAnalysis)' == 'false' 
           or '$(RunCodeAnalysis)' == 'never'" >
于 2019-07-22T10:39:34.870 回答
1

.Net 5支持的项目中,您可以简单地编辑.csproj并添加:

  • <RunAnalyzersDuringBuild>false</RunAnalyzersDuringBuild>在构建时禁用代码分析
  • <RunAnalyzersDuringLiveAnalysis>false</RunAnalyzersDuringLiveAnalysis>在实时分析中禁用代码分析
  • <RunAnalyzers>false</RunAnalyzers>阻止分析器在此项目上运行

我在我的单元测试项目中使用它,方法是将它添加PropertyGroupTargetFramework类似的内容中:

<PropertyGroup>
        <TargetFramework>net5.0</TargetFramework>
        <IsPackable>false</IsPackable>
        <!--disable code analysis on this XUNIT Project-->
        <RunAnalyzersDuringBuild>false</RunAnalyzersDuringBuild>
        <RunAnalyzersDuringLiveAnalysis>false</RunAnalyzersDuringLiveAnalysis>
        <RunAnalyzers>false</RunAnalyzers>
</PropertyGroup>

有关详细信息,请参阅MS 文档

于 2021-05-04T15:59:10.307 回答