【问题标题】:How do you disable Roslyn Analyzers when using msbuild through the command line?通过命令行使用 msbuild 时如何禁用 Roslyn 分析器?
【发布时间】:2019-10-23 09:31:43
【问题描述】:

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

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

我有一个相当大的解决方案,大多数项目使用 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

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

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

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

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

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

【问题讨论】:

标签: msbuild fxcop roslyn-code-analysis


【解决方案1】:

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

在您的解决方案根文件夹中创建Directory.Build.targets (msbuild >= v15.0)、After.{SolutionName}.sln.targets (msbuild

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

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

我们只花了 2 小时研究如何禁用基于 MSBuild 属性 AMA 的分析器。

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

【讨论】:

  • 我没有任何运气让 Directory.Build.targets 方法工作,但成功地将目标添加到 .csproj 文件。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    如果其他人碰巧发现自己在这里,我在 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>
    

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多