Notre équipe utilise la fonctionnalité d'analyse de code avec un ensemble de règles personnalisé pour que notre construction échoue si nous oublions de faire des choses comme des vérifications nulles sur les arguments de méthodes.
Cependant, maintenant que nous créons un nouveau projet .NET Core, il ne semble pas que l'analyse de code soit une fonctionnalité de ces nouveaux projets. Il n'y a pas d'interface utilisateur dans la zone Propriétés du projet et l'ajout d'un jeu de règles personnalisé au projet comme recommandé ici ne semble affecter que les analyseurs StyleCop (les règles SAxxxx
.).
Est-il possible d'activer les règles d'analyse de code (CAxxxx
) dans un projet .NET Core?
Apparemment, la bonne façon de procéder consiste à installer le package Microsoft.CodeAnalysis.FxCopAnalyzers NuGet. Cela fonctionne très bien, même sur les projets ASP.NET Core, et n'exige pas du tout l'indicateur <RunCodeAnalysis>
.
J'ai réalisé qu'il y a une autre balise dans le fichier csproj qui permet de permettre l'analyse du code. La balise <PropertyGroup>
Dans mon fichier .csproj ressemble maintenant à ceci:
<PropertyGroup>
<TargetFramework>netstandard1.4</TargetFramework>
<CodeAnalysisRuleSet>..\MyCompanyCodeAnalysisRules.ruleset</CodeAnalysisRuleSet>
<RunCodeAnalysis>true</RunCodeAnalysis>
</PropertyGroup>
Et cela fonctionne très bien, au moins sur des projets normaux. Un projet ASP.NET Core génère les erreurs suivantes:
CA0055 : Could not identify platform for 'C:\Source\...\bin\Debug\netcoreapp1.1\....dll'.
CA0052 : No targets were selected.
Normalement, la seule chose à faire est d'installer le nuget Microsoft.CodeAnalysis.FxCopAnalyzers sur votre projet.
Mais comme mentionné correctement, cela ne fonctionne pas, en particulier pour .Net Core (actuellement vs2017).
Afin de travailler également pour les projets principaux d'aspnet et de résoudre l'erreur:
"Impossible d'identifier la plateforme pour ..."
Modifiez manuellement le fichier csproj du projet et veillez à ne pas insérer la balise RunCodeAnalysis
. Faites le PropertyGroup comme ça:
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<CodeAnalysisRuleSet>..\MyStylecop.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
De même, si vous devez placer un fichier de règles donné, veillez à le placer dans le chemin correct, comme indiqué ci-dessus ..\MyStylecop.ruleset
. MyStylecop.ruleset est le fichier avec les règles (en fait, celles qui ont été supprimées, je pense - donc c'est de la logique inverse).
Par exemple, mon fichier de règles est:
<?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>