通过命令行使用 msbuild 时如何禁用 Roslyn 分析器?

Ric*_*ich 8 msbuild fxcop roslyn-code-analysis

Roslyn 分析器作为 nuget 包安装,它们是 FxCop 分析器的依赖项(也作为 nuget 包安装)。

我已按照此处的说明启用完整解决方案分析:如何启用和禁用托管代码的完整解决方案分析

我有一个相当大的解决方案,其中大多数项目使用 FxCop/Roslyn 分析器和 Visual Studio 构建良好,通常在一分钟内。

但是,当使用以下命令通过命令行运行 msbuild 时:

"C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/MSBuild.exe" "C:\Source\MySolution\MySmartClient.sln" /p:Configuration=Develop;Platform="Any CPU" /
t:Build
Run Code Online (Sandbox Code Playgroud)

构建解决方案需要 4-15 分钟。在使用相同命令的构建服务器上也是如此。

我试过了/p:RunCodeAnalysis=False,没有效果。我还使用进程监视器来模拟 VS 发送到 msbuild 的 msbuild 命令,而没有任何更改。

并且,根据此文档:如何:启用和禁用托管代码的自动代码分析

Enable Code Analysis on Build 复选框仅影响静态代码分析。它不会影响 Roslyn 代码分析器,如果将它们安装为 NuGet 包,它们总是在构建时执行。

这些过多的构建时间是不切实际的。通过命令行使用 msbuild 时有什么方法可以禁用吗?

jes*_*ing 6

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

在您的解决方案根文件夹中创建一个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>
Run Code Online (Sandbox Code Playgroud)

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

也可以看看:

您可以编辑条件以同时触发RunCodeAnalysis=FalseNever

<Target Name="DisableAnalyzers" 
        BeforeTargets="CoreCompile" 
        Condition="
           '$(UseRoslynAnalyzers)' == 'false' 
           or '$(RunCodeAnalysis)' == 'false' 
           or '$(RunCodeAnalysis)' == 'never'" >
Run Code Online (Sandbox Code Playgroud)

要禁用特定的分析器,请使用以下技巧:

我们只花了 2 个小时弄清楚如何基于 MSBuild 属性 AMA 禁用分析器。

https://twitter.com/Nick_Craver/status/1173996405276467202?s=09

在此处输入链接描述


Rya*_*anY 6

自原始答案以来,文档已更改。现在有这个页面记录了如何禁用分析器的代码分析

有 3 个 MSBuild 属性可用于控制分析器行为(均默认为 true):

  • RunAnalyzersDuringBuild控制分析器是否在构建时运行。
  • RunAnalyzersDuringLiveAnalysis控制分析器是否在设计时实时分析代码。
  • RunAnalyzers在构建和设计时禁用分析器。此属性优先于 RunAnalyzersDuringBuild 和 RunAnalyzersDuringLiveAnalysis。

编辑:除非您的项目包含 Microsoft.CodeAnalysis.targets,否则似乎在跟踪这些道具不起作用的问题。因此,在修复之前,您的里程可能会有所不同。


Ric*_*ich 4

如果其他人碰巧发现自己在这里,我在 Github 上的 dotnet/roslyn 项目中遇到了这个问题:

功能:用于打开/关闭分析的 MSBuild 开关 #23591

上一问题描述了一种解决方法:

替代旧的 MSBuild 属性?第1431章

<PropertyGroup>
    <RunCodeAnalysis Condition="'$(RunCodeAnalysis)' == ''">true</RunCodeAnalysis>
</PropertyGroup>
<ItemGroup>
    <PackageReference Include="<whatever analyzers package you are depending on>" Condition="'$(RunCodeAnalysis)' == 'true'" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
# You'll need to run a restore when changing this value
msbuild /p:RunCodeAnalysis=false
Run Code Online (Sandbox Code Playgroud)

尽管如此,我还是有一些差异,因为我没有使用包引用。这对我有用。

<ItemGroup>
    <Analyzer Include="<whatever analyzers package you are depending on>" Condition="'$(RunCodeAnalysis)' == 'true'" />
</ItemGroup>

<!-- I added the condition to the EnsureNugetPackageBuildImports too. -->
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="'$(RunCodeAnalysis)' == 'true' AND !Exists('<relative path to the prop of whatever analyzers you are depending on>')" Text="$([System.String]::Format('$(ErrorText)', '<relative path to the prop of whatever analyzers you are depending on>'))" />
</Target>
Run Code Online (Sandbox Code Playgroud)