【问题标题】:How do I specify a custom code analysis ruleset for multiple projects in a solution using Visual Studio 2019?如何使用 Visual Studio 2019 为解决方案中的多个项目指定自定义代码分析规则集?
【发布时间】:2019-09-12 10:37:55
【问题描述】:

我有一个自定义代码分析规则集,我想将其应用于我的解决方案中多个项目的所有配置,但我不知道该怎么做。

明确地说,我正在寻找一种方法(如果有的话)一步完成,而不是从 IDE 编辑每个项目的属性。

到目前为止,我找到了这个指导:https://docs.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 roslyn solution static-code-analysis roslyn-code-analysis


    【解决方案1】:

    我不知道是否有办法在 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" } 
    

    【讨论】:

    • 我在大型解决方案中也有 vbproj,不能只启用 treatwarningsaserrors 甚至打开严格。是的,我继承了遗留代码...并希望使用此规则集搜索死代码 stackoverflow.com/questions/30974433/…
    【解决方案2】:

    对于specify a rule set for a project,使用CodeAnalysisRuleSet MSBuild 属性。

    为此,您可以通过多种方式customize your build

    【讨论】:

    • 是的,确实如此。但我的问题是,如何在一个或简单的步骤中为所有项目的所有配置执行此操作,而不是通过 IDE 单独编辑每个项目的属性。我将调整我的问题以使其更清晰。
    • @Chris 迟到了,但这应该可以解决问题:stackoverflow.com/a/64359944/227779
    【解决方案3】:

    如果我正确理解了这个问题,可以按照this blog post 中概述的步骤轻松完成。

    Directory.Build.props 方法

    本指南的编写考虑了StyleCop,但同样的步骤适用于任何分析器。

    1. 创建一个名为 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>
    
    1. 使用您的分析仪配置创建一个StyleCop.ruleset 文件。

    就是这样。下次您运行 dotnet build 或在 Visual Studio 中构建项目时(如果已打开解决方案,您可能需要关闭/重新打开它),这些规则应该适用。


    作为参考,这是我的一个项目中的Directory.Build.props文件:https://github.com/perlun/perlang/blob/master/Directory.Build.props

    【讨论】:

    • 这将适用于dotnet build,但在编辑源文件时不适用于 Visual Studio。即使在使用此方法指定的规则集中被抑制,它的编辑器仍会显示错误。
    【解决方案4】:

    如果您的解决方案中的项目具有层次结构,这意味着它们相互引用并具有共同的、最抽象的基础,该基础位于类似于此的结构中:

    Common
    ├── Worker
    └── Persistence
        └── API
    

    ...然后你可以在你的根项目中引用StyleCop.Analyzers包,并将&lt;PrivateAssets&gt;标签的值设置为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 包引用添加到您的项目时默认设置。什么意思?

    您可能将依赖项纯粹用作开发工具,并且可能不希望将其公开给将使用您的包的项目。在这种情况下,您可以使用 PrivateAssets 元数据来控制此行为。 ~Docs

    因此,默认情况下,StyleCop.Analyzers 只会在您明确引用包的项目中启用。但是在我参与的几乎所有代码库中,都希望在解决方案中的所有项目中强制执行 StyleCode 规则(几乎所有项目,除了具有自动生成代码的项目,例如 EF 迁移)。将包引用元数据中的 all 更改为 none 将导致将样式规则传递给依赖它的所有项目。

    解决方案

    总之,根项目Common在将&lt;PrivateAssets&gt;设置为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>
    

    WorkerPersistence 或任何其他依赖项目只需要引用前一层,这在任何分层架构中都是常见的做法:

    <ItemGroup>
        <ProjectReference Include="..\Common\Common.csproj" />
    </ItemGroup>
    

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 2023-04-02
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多