我有一个自定义代码分析规则集,我想将其应用于解决方案中多个项目的所有配置,但看不到如何做到这一点。
需要明确的是,我正在寻找一种在单个步骤中执行此操作的方法(如果有的话(,而不是从 IDE 编辑每个项目的属性。
到目前为止,我找到了这个指南:https://learn.microsoft.com/en-us/visualstudio/code-quality/how-to-configure-code-analysis-for-a-managed-code-project?view=vs-2019#specify-rule-sets-for-multiple-projects-in-a-solution
但这似乎不正确。在 Visual Studio 2019 中,如果我转到"分析>配置代码分析">"对于解决方案",我会收到一个空白属性页,其中包含以下消息:
注意:此属性页已弃用,将在将来的产品版本中删除。
还有其他方法可以做到这一点吗?我有很多项目:(
谢谢。
我没有关于是否有办法在Visual Studio中做到这一点的答案,所以我不得不直接以批处理方式更改.csproj文件。
我发现的约翰·罗宾斯(John Robbins(的这个脚本非常好: https://www.wintellect.com/batch-updating-changing-visual-studio-projects-with-powershell/
安装后,我的用法是这样的,以防有人感兴趣:
dir -recurse *.csproj | Set-ProjectProperties -OverrideDefaultProperties -CustomConfigurationProperties @{ "CodeAnalysisRuleSet" = ".SystemStandard.ruleset" }
dir -recurse *.csproj | Set-ProjectProperties -OverrideDefaultProperties -CustomConfigurationProperties @{ "RunCodeAnalysis" = "false" }
dir -recurse *.csproj | Set-ProjectProperties -OverrideDefaultProperties -CustomConfigurationProperties @{ "TreatWarningsAsErrors" = "true" }
若要为项目指定规则集,请使用CodeAnalysisRuleSet
MSBuild 属性。
为此,您可以通过多种方式自定义构建
如果我正确理解了这个问题,那么按照这篇博文中概述的步骤可以轻松完成。
Directory.Build.props
方法
本指南在编写时考虑了 StyleCop,但相同的步骤应该适用于任何分析器。
- 创建一个名为
Directory.Build.props
的文件(使用此确切大小写(以及您的.sln
文件,即在项目的顶层。它的内容应该是这样的:
<Project>
<PropertyGroup>
<!-- This part specifies the ruleset file name. Change to something
more appropriate if not using StyleCop. -->
<CodeAnalysisRuleSet>$(SolutionDir)StyleCop.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<!-- This part adds StyleCop as a reference in all projects + makes the
top-level stylecop.json file be used by all projects. Skip this
altogether if you are not spefically using StyleCop. -->
<ItemGroup>
<PackageReference Include=”StyleCop.Analyzers” Version=”1.1.1-rc.108" PrivateAssets=”all” />
<AdditionalFiles Include=”$(SolutionDir)stylecop.json” Link=”stylecop.json” />
</ItemGroup>
</Project>
- 使用分析器配置创建
StyleCop.ruleset
文件。
就是这样。下次在 Visual Studio 中运行dotnet build
或生成项目时(如果已打开解决方案,则可能必须关闭/重新打开解决方案(,应应用这些规则。
作为参考,这是我的一个项目中Directory.Build.props
文件:https://github.com/perlun/perlang/blob/master/Directory.Build.props
如果解决方案中的项目具有分层结构,这意味着它们相互引用,并且具有一个通用的、最抽象的基础,该基础根的结构类似于以下内容:
Common
├── Worker
└── Persistence
└── API
。然后,您可以在根项目中引用StyleCop.Analyzers
包,并将<PrivateAssets>
标记的值设置为none
:
<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>none</PrivateAssets>
</PackageReference>
</ItemGroup>
默认情况下,all
在将StyleCop.Analyzers
包引用添加到项目时设置。什么意思?
您可能纯粹将依赖项用作开发工具,并且可能不希望将其公开给将使用您的包的项目。在此方案中,可以使用私有资产元数据来控制此行为。~文档
因此,默认情况下,StyleCop.Analyzers
只会在显式引用包的项目中启用。但是在我参与过的几乎所有代码库中,都需要在解决方案中的所有项目中强制实施 StyleCode 规则(几乎所有项目,除了具有自动生成代码的项目,例如 EF 迁移(。将包引用元数据中的all
更改为none
将导致将样式规则传递给依赖于它的所有项目。
溶液
总而言之,根项目Common在将<PrivateAssets>
设置为none
时必须引用StyleCop.Analyzers
包:
<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>none</PrivateAssets>
</PackageReference>
</ItemGroup>
Worker或Persistence或任何其他依赖项目只需要引用前一层,这在任何分层架构中都是常见的做法:
<ItemGroup>
<ProjectReference Include="..CommonCommon.csproj" />
</ItemGroup>