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 时有什么方法可以禁用吗?
它并不真正受支持,但有一个解决方法:
在您的解决方案根文件夹中创建一个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=False或Never。
<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
自原始答案以来,文档已更改。现在有这个页面记录了如何禁用分析器的代码分析:
有 3 个 MSBuild 属性可用于控制分析器行为(均默认为 true):
编辑:除非您的项目包含 Microsoft.CodeAnalysis.targets,否则似乎在跟踪这些道具不起作用的问题。因此,在修复之前,您的里程可能会有所不同。
如果其他人碰巧发现自己在这里,我在 Github 上的 dotnet/roslyn 项目中遇到了这个问题:
功能:用于打开/关闭分析的 MSBuild 开关 #23591
上一问题描述了一种解决方法:
<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)
| 归档时间: |
|
| 查看次数: |
3836 次 |
| 最近记录: |