在.NET核心项目上启用Microsoft的代码分析

时间:2017-06-23 16:47:38

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

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

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

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

2 个答案:

答案 0 :(得分:29)

更新

显然,正确的方法是安装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.

答案 1 :(得分: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>