如何从命令行界面使用 Microsoft.CodeAnalysis.NetAnalyzers 为 .NET 应用程序运行代码分析

Posted

技术标签:

【中文标题】如何从命令行界面使用 Microsoft.CodeAnalysis.NetAnalyzers 为 .NET 应用程序运行代码分析【英文标题】:How do I run code analysis for .NET application using Microsoft.CodeAnalysis.NetAnalyzers from a command line interface 【发布时间】:2021-12-09 06:51:23 【问题描述】:

设置:

    .NET Core 3.1 控制台应用 Microsoft.CodeAnalysis.NetAnalyzers 作为 NuGet 包安装

问题: 我需要从命令行界面运行代码分析,以将其作为我的 CI(持续集成)构建过程中的一个步骤。

理想情况下,我希望在构建 TypeScript 应用程序并将所有问题输出到控制台之前运行类似于 ESLint 或 TSLint 的东西,并且在出现代码分析问题时不让构建过程继续进行。

感谢任何帮助!

【问题讨论】:

【参考方案1】:

.NET 分析器在 build 上运行。

默认情况下,仅启用一些规则:请参阅Code quality analysis: Enabled rules。要启用所有规则,您可以在您的.csproj 或项目目录或以上目录中的Directory.Build.props 文件中设置<AnalysisMode>AllEnabledByDefault</AnalysisMode>

大多数诊断报告为严重性Warning,因此它们不会破坏您的构建。但是MSBuild 也可以选择TreatWarningsAsErrors。我建议仅在 Release 构建(或非Debug 构建,取决于您的偏好)中使用 TreatWarningsAsErrors,这样您就可以在编码时执行快速原型设计并促进满足TDD 循环,无需在开发过程中立即担心每一个警告。但是,当您将 CI 设置为使用 Release Configuration 构建时,如果存在任何 Warning(现在视为错误)。

示例:

.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>

    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)' == 'Release'">
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="5.0.3" PrivateAssets="all" />
  </ItemGroup>

</Project>

CLI

dotnet build --configuration Release

如果存在任何Warnings,它们在发布配置中被视为Errors,dotnet build 将以非零退出代码终止,使您的 CI 管道失败.

我已经使用 .NET 5.0 SDK 测试了这个示例。

请记住,对于 .NET 5.0 SDK 及更高版本,Microsoft.CodeAnalysis.NetAnalyzers 包含在 SDK 中,并且可以通过 &lt;EnableNETAnalyzers&gt;true&lt;/EnableNETAnalyzers&gt; 启用。如果您更喜欢基于 NuGet 包的模型进行按需版本更新,则不应添加 EnableNETAnalyzers 属性。另外请记住,.NET 6.0 SDK 提供了更细粒度的AnalysisMode:请参阅MSBuild: AnalysisMode。

如果您不关心分析器中的每个诊断,并且想要覆盖特定规则的默认严重性,您可以将Global AnalyzerConfig (.globalconfig) 文件添加到您的项目目录或以上配置分析器。

.globalconfig (AnalyzerConfig)

is_global = true

# CA1062: Validate arguments of public methods
dotnet_diagnostic.CA1062.severity = silent

# CA1707: Identifiers should not contain underscores
dotnet_diagnostic.CA1707.severity = silent

# CA2007: Consider calling ConfigureAwait on the awaited task
dotnet_diagnostic.CA2007.severity = silent

这个例子取自我的一个单元测试项目,我不想验证我的参数化单元测试方法,我在单元测试方法名称中使用下划线,并且我不关心@987654347 @。

使用 AnalyzerConfig 文件,您可以控制每个规则的严重性,并将其强制为 defaultnonesilentsuggestionwarning 或 @ 987654353@。见Rule-specific options: Severity level。

一些规则提供了额外的配置选项。例如。 CA2007 只能应用于产生某个OutputType 的代码,例如.dll,通过:

dotnet_code_quality.CA2007.output_kind = DynamicallyLinkedLibrary

我不确定在哪里停下来。让我知道这是否回答了您的问题,或者我是否应该提供更多详细信息。以下是该主题的官方文档链接(非常全面):Code analysis: Overview of .NET source code analysis。

请记住,罗斯林很棒! ?

【讨论】:

感谢@FlashOver 的精彩回答! 如果我可以再问一个问题 - 您能否为生成的 sarif 文件提供报告工具或查看器(以便更轻松地查看和检查代码分析问题) @DmitryMishin 恐怕到目前为止我还没有使用过 SARIF ?。

以上是关于如何从命令行界面使用 Microsoft.CodeAnalysis.NetAnalyzers 为 .NET 应用程序运行代码分析的主要内容,如果未能解决你的问题,请参考以下文章

如何从命令行界面检查 Apache Phoenix 的版本?

centOS6.5如何从启动界面直接进入命令行界面

Ubuntu怎么从图形桌面切换到命令行界面

Ubuntu怎么从图形桌面切换到命令行界面

Ubuntu怎么从图形桌面切换到命令行界面

Ubuntu怎么从图形桌面切换到命令行界面