通过命令行使用msbuild时如何禁用Roslyn Analyzers?

时间:2019-06-07 22:04:15

标签: msbuild fxcop roslyn-code-analysis

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

我已按照此处的说明启用了完整的解决方案分析:How to Enable and disable full solution analysis for managed code

对于使用FxCop / Roslyn Analyzers的大多数项目,我有一个相当大的解决方案,并且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

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

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

并且,根据此文档:How to: Enable and disable automatic code analysis for managed code

  

在构建中启用代码分析复选框仅影响静态代码分析。它不会影响Roslyn代码分析器,如果您将它们安装为NuGet软件包,则它们始终在构建时执行。

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

3 个答案:

答案 0 :(得分:3)

自原始答案以来,文档已更改。现在有this page documenting how to disable code analysis from analyzers

您可以使用3个MSBuild属性来控制分析器的行为(所有默认设置为true):

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

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

答案 1 :(得分:1)

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

Feature: MSBuild switch for turning on/off analysis #23591

前面的问题描述了一种解决方法:

Substitute for old MSBuild properties? #1431

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

尽管,但是由于我没有使用包引用,所以我有一些区别。这对我有用。

<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>

答案 2 :(得分:0)

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

在解决方案根文件夹中创建一个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:UseRosynAnalyzers=false来删除项目中配置的所有分析器。

另请参阅:

您可以编辑条件以在RunCodeAnalysis=FalseNever上触发。

<Target Name="DisableAnalyzers" 
        BeforeTargets="CoreCompile" 
        Condition="
           '$(UseRoslynAnalyzers)' == 'false' 
           or '$(RunCodeAnalysis)' == 'false' 
           or '$(RunCodeAnalysis)' == 'never'" >