启用 Microsoft 对 .NET Core 项目的代码分析

Enabling Microsoft's Code Analysis on .NET Core Projects

我们的团队使用带有自定义规则集的代码分析功能,如果我们忘记对方法参数进行空检查等操作,就会导致构建失败。

但是,现在当我们创建一个新的 .NET Core 项目时,代码分析似乎并不是这些新项目的一项功能。在项目属性区域中没有 UI,向项目添加自定义规则集 似乎只会影响 StyleCop Analyzers(SAxxxx 规则)。

有什么方法可以在 .NET Core 项目中启用代码分析 (CAxxxx) 规则吗?

2021 年更新

FxCopAnalyzers 已被弃用,现在建议使用更有限的 Microsoft.CodeAnalysis.NetAnalyzers 包。

有关详细信息,请参阅 https://github.com/dotnet/roslyn-analyzers and https://docs.microsoft.com/en-us/visualstudio/code-quality/migrate-from-fxcop-analyzers-to-net-analyzers?view=vs-2019

更新

显然正确的方法是安装 Microsoft.CodeAnalysis.FxCopAnalyzers NuGet 包。这很好用,即使在 ASP.NET 核心项目上,也根本不需要 <RunCodeAnalysis> 标志。

原答案

我意识到 csproj 文件中还有另一个标签,它实际上 启用 代码分析。我的 .csproj 文件中的 <PropertyGroup> 标记现在如下所示:

  <PropertyGroup>
    <TargetFramework>netstandard1.4</TargetFramework>
    <CodeAnalysisRuleSet>..\MyCompanyCodeAnalysisRules.ruleset</CodeAnalysisRuleSet>
    <RunCodeAnalysis>true</RunCodeAnalysis>
  </PropertyGroup>

而且效果很好,至少在普通项目上是这样。 ASP.NET 核心项目产生以下错误:

CA0055 : Could not identify platform for 'C:\Source\...\bin\Debug\netcoreapp1.1\....dll'.
CA0052 : No targets were selected.

通常,您唯一需要做的就是在您的项目中安装 Microsoft.CodeAnalysis.FxCopAnalyzers nuget。

但是如前所述,这不起作用,尤其是对于 .Net Core(目前在 vs2017 中)。

为了同样适用于 aspnet 核心项目,并解决错误:

"Could not identify platform for ..."

手动修改项目的csproj文件,确保不插入RunCodeAnalysis标签。像这样制作 PropertyGroup:

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
  <CodeAnalysisRuleSet>..\MyStylecop.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>

此外,如果您需要放置给定的规则集文件,请确保将其放置在正确的路径中,如上所示 ..\MyStylecop.ruleset。 MyStylecop.ruleset 是带有规则的文件(我认为实际上是被抑制的 - 所以它是逆逻辑)。

例如我的规则集文件是:

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Default stylecop settings" Description="This rule set contains all rules (as warnings), with a few specific supressions." ToolsVersion="15.0">
  <IncludeAll Action="Warning" />
  <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
    <Rule Id="CA1004" Action="None" />
    <Rule Id="CA1006" Action="None" />
    <Rule Id="CA1020" Action="None" />
    <Rule Id="CA1025" Action="None" />
    <Rule Id="CA1032" Action="None" />
    <Rule Id="CA1054" Action="None" />
    <Rule Id="CA1055" Action="None" />
    <Rule Id="CA1056" Action="None" />
    <Rule Id="CA1062" Action="None" />
    <Rule Id="CA1300" Action="None" />
    <Rule Id="CA1303" Action="None" />
    <Rule Id="CA1704" Action="Warning" />
    <Rule Id="CA1709" Action="None" />
    <Rule Id="CA2007" Action="None" />
    <Rule Id="CA2225" Action="None" />
    <Rule Id="CA2227" Action="None" />
    <Rule Id="CA2233" Action="None" />
    <Rule Id="CA2234" Action="None" />
    <Rule Id="CA2237" Action="None" />
    <Rule Id="CS1591" Action="None" />
    <Rule Id="CA1715" Action="None" />
  </Rules>
  <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers">
    <Rule Id="SA1101" Action="None" />
    <Rule Id="SA1116" Action="None" />
    <Rule Id="SA1117" Action="None" />
    <Rule Id="SA1118" Action="None" />
    <Rule Id="SA1208" Action="None" />
    <Rule Id="SA1600" Action="None" />
    <Rule Id="SA1601" Action="None" />
    <Rule Id="SA1602" Action="None" />
    <Rule Id="SA1623" Action="None" />
    <Rule Id="SA1633" Action="None" />
    <Rule Id="SA1634" Action="None" />
    <Rule Id="SA1637" Action="None" />
    <Rule Id="SA1640" Action="None" />
    <Rule Id="SA1652" Action="None" />
    <Rule Id="SA0001" Action="None" />
    <Rule Id="SA1314" Action="None" />
  </Rules>
</RuleSet>