使用MSBuild 14时禁用代码分析

17
我有一个包含多个C# 6.0项目的.NET解决方案。每个项目都通过NuGet引用StyleCop Analyzer。在Visual Studio中,我可以区分构建和分析代码,但我不知道如何在命令行上使用MSBuild v14.0执行此操作(例如在CI服务器上)。我使用以下选项调用msbuild mySolution.sln /t:Rebuild,但它们都没有奏效:
  • /p:RunCodeAnalysis=False
  • /p:RunCodeAnalysisOnThisProject=False
  • /p:RunCodeAnalysis=False,RunCodeAnalysisOnThisProject=False
无论我做什么,警告SAxxxx仍然会出现在输出中。有人知道如何在使用MSBuild时禁用代码分析吗?
背景:在我们的CI服务器上,我想区分“基本的MSBuild警告”和来自静态代码分析的警告。
问候

相关链接:https://dev59.com/CLTma4cB1Zd3GeqP5V4l - jessehouwing
4个回答

8

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

在构建服务器TFSBuild.proj中定义的RunCodeAnalysis设置与本地MSBuild项目模式选项存在显著差异。

构建服务器支持RunCodeAnalysis的“始终,默认,从不”值。相比之下,本地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。
在构建服务器上:
“始终”告诉MSBuild使用RunCodeAnalysis=True编译所有项目。
“从不”告诉MSBuild在所有项目上禁止代码分析(RunCodeAnalysis=False)。
因此,RunCodeAnalysis的值是“默认、始终、从不”或“True、False”,具体取决于您的构建方式。
您可以参考如何:编辑构建类型CodeAnalysis、FxCop和Team Build以获取更详细的信息。
更新: 根据mu88的回复,我在Jenkins上创建了一个测试演示,其中RunCodeAnalysis=False,预期地禁用了代码分析。以下是我的Jenkins配置:

enter image description here

此外,您还可以检查构建日志是否包含从“Running Code Analysis...”到“Code Analysis Complete”的部分。对于警告SAxxxx仍然出现在输出中,这不是代码分析结果。您可以在Visual Studio上进行测试,而无需进行代码分析。安装StyleCop.Analyzers包后,构建项目,您将获得这些警告。
因此,请在使用参数:/p:RunCodeAnalysis=False构建项目后,仔细检查Jenkins上的构建日志是否包含“Running Code Analysis...”和“Code Analysis Complete”部分。
更新2:
如果您想要抑制StyleCop警告,则可以通过在.cs文件顶部添加此标头来欺骗StyleCop根本不处理该文件:
//------------------------------------------------------------------------------
// <auto-generated>
// Well, not really. This is just a trick to get StyleCop off my back.
// </auto-generated>
//------------------------------------------------------------------------------

谢谢您的回复,但是我们使用的是Jenkins而不是TFS。无论如何,将False替换为Never并不会改变行为。 - mu88
抱歉回复晚了。我在Jenkins上创建了一个测试演示,其中RunCodeAnalysis=False,一切都正常工作。您可以参考我的答案更新。 - Leo Liu
1
谢谢您的回复。对我来说,将RunCodeAnalysis设置为False就像禁用StyleCop.Analyzers一样,抱歉没有表达清楚。如果我想要排除来自StyleCop.Analyzers的MSBuild警告,我该怎么做?还是不可能? - mu88
@mu88,你可以参考我的回答中的update2,看看它是否解决了你的问题。如果上述答案解决了你的问题,你可以将其标记为答案,这样可以帮助其他遇到相同问题的社区成员。如果没有解决,你可以告诉我们你的问题。谢谢。 - Leo Liu
1
谢谢您的更新,但我想在MSBuild级别上禁用StyleCop警告,而不是在源代码中进行修改。 - mu88
为了澄清 OP 的评论以及我为什么发起了赏金计划,这不是禁用分析器的解决方案(新的 ROSLYN 分析器,而不是旧的静态代码分析器),当从命令行运行 MSBuild v14 时。 - Alex

8

虽然不是官方支持的,但有一个解决方法:

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

<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=falseNever时触发。
<Target Name="DisableAnalyzers" 
        BeforeTargets="CoreCompile" 
        Condition="
           '$(UseRoslynAnalyzers)' == 'false' 
           or '$(RunCodeAnalysis)' == 'false' 
           or '$(RunCodeAnalysis)' == 'never'" >

你试过这个吗?对我来说似乎它不会在 BeforeTargets="CoreCompile" 上触发。我已经添加了一条消息,我在 BeforeTargets="Build" 上看到了它,但它仍然尝试运行分析器。 - Alex
Nuget、packages.config 和 after.solution.sln.targets(因为它是 msbuild v14) - Alex
1
我找到了问题所在。我们将目标指定为msbuild的参数,例如/t:Clean,Build。这在msbuild > 14中很好用,并且DisableAnalyzers-target也可以正常工作。但是当使用msbuild 14时,这会导致DisableAnalyzers-target无法触发。如果将目标添加到参数中,我们可以通过添加的日志消息看到它以某种方式运行,但它不会影响分析器。因此,对于我们来说,解决方案似乎是在使用msbuild 14时仅使用默认目标,而不是显式提供msbuild的目标。 - Alex
不过有一件奇怪的事情是,如果在msbuild v14中不使用显式目标参数,则即使禁用了DisableAnalyzers-target,它也不会尝试运行分析器... - Alex
1
你能否编辑答案并提供相关细节?很高兴你找到了可行的解决方案!现在尽快升级到MsBuild 16吧 ;)。 - jessehouwing
太好了,这将消除所有在NET5中引入并从NET6开始的源生成器,因此也包括所有的Razor处理。 - springy76

1
在支持 .Net 5 的项目中,您可以简单地编辑 .csproj 并添加以下内容:
  • <RunAnalyzersDuringBuild>false</RunAnalyzersDuringBuild> 禁用构建时的代码分析
  • <RunAnalyzersDuringLiveAnalysis>false</RunAnalyzersDuringLiveAnalysis> 禁用实时分析上的代码分析
  • <RunAnalyzers>false</RunAnalyzers> 防止该项目上运行分析器
我会在我的单元测试项目中将其添加到包含 TargetFrameworkPropertyGroup 中。
<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>

如需更多详细信息,请参考微软文档


0
如果您的解决方案中有大量的 csproj 文件,为每个项目设置起来会很慢。 请下载适用于 Visual Studio 2022 的扩展程序:SwitchRunCodeAnalysis。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接