【问题标题】:Enabling Microsoft's Code Analysis on .NET Core Projects启用 Microsoft 对 .NET Core 项目的代码分析
【发布时间】:2017-06-23 16:47:37
【问题描述】:

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

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

有没有办法在 .NET Core 项目中启用代码分析 (CAxxxx) 规则?

【问题讨论】:

    标签: c# code-analysis roslyn-code-analysis


    【解决方案1】:

    2021 年更新

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

    请参阅https://github.com/dotnet/roslyn-analyzershttps://docs.microsoft.com/en-us/visualstudio/code-quality/migrate-from-fxcop-analyzers-to-net-analyzers?view=vs-2019 了解更多详情。

    更新

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

    原答案

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

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

    而且效果很好,至少在正常项目中是这样。一个 ASP.NET Core 项目产生以下错误:

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

    【讨论】:

    • 在使用 nuget 包时是否有更新答案的文档?例如,如果你走 nuget 路线,如何使用自定义规则集?
    • @ScottLin:您仍然需要将&lt;CodeAnalysisRuleSet&gt; 标签添加到您的项目文件中。 NuGet 方法仍将查看该标记来决定要检查哪些规则。
    • 已弃用。 github.com/dotnet/roslyn-analyzers 改用 Microsoft.CodeAnalysis.NetAnalyzers
    【解决方案2】:

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

    但正如正确提到的,这不起作用,尤其是对于 .Net Core(目前在 vs2017 中)。

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

    “无法识别平台...”

    手动修改项目的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>
    

    【讨论】:

    • 在当前的 VS2017 中,截至今天,它可以在添加 nuget 包时运行并运行所有推荐的规则集,无需编辑,需要更改 .csproj
    猜你喜欢
    • 2017-10-26
    • 2021-06-24
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多