启用 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>
我们的团队使用带有自定义规则集的代码分析功能,如果我们忘记对方法参数进行空检查等操作,就会导致构建失败。
但是,现在当我们创建一个新的 .NET Core 项目时,代码分析似乎并不是这些新项目的一项功能。在项目属性区域中没有 UI,向项目添加自定义规则集 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>