craftingIT

bridgingIT - Blog

Visual Studio und .Net Core: Ruleset in verschiedenen Projekten der Solution nutzen

- Tobias Meier - Microsoft Individualentwicklung
Themen: Microsoft, Individualentwicklung, Visual Studio
Blog Bild

Bei .Net Projekten bietet Visual Studio die Möglichkeit, über die Oberfläche ein Ruleset auszuwählen, welches für eine Solution die aktivierten / deaktivierten Regeln angibt. So ist es auch möglich, dass sich verschiedene Projekte ein identisches Ruleset teilen.

Bei .Net Core-Projekten bietet die Oberfläche von Visual Studio leider keine Möglichkeit zur Auswahl eines Rulesets an. Sobald eine Regel deaktiviert oder aktiviert wird, erzeugt Visual Studio auf Projektebene eine Datei mit dem Namen des Projekts und der Endung "ruleset".

Um nun doch ein Ruleset in allen Projekten zu nutzen, bieten sich zwei Möglichkeiten an:

  • Manuelles Bearbeiten der Projektdatei
  • Directory.Build.Props

Variante 1: Manuelles Bearbeiten der Projektdatei

Kopieren Sie zuerst das gewünschte Ruleset auf Solutionebene. Anschließend können Sie bei allen Projekten manuell den Pfad auf das Ruleset anpassen bzw. überhaupt ein Ruleset konfigurieren:

Nach einem Aufruf von "Unload Projekts" kann die Projektdatei Über "Edit Projektname" bearbeitet werden. Passen Sie die Pfadangabe in den vorhandenen Definitionen von CodeAnalysisRuleSet entsprechend ihrer Anforderungen an, bzw. kopieren Sie die beiden folgenden PropertyGroup-Definitionen in die Projektdatei:

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<CodeAnalysisRuleSet>../bIT.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<CodeAnalysisRuleSet>../bIT.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>

Variante 2: Directory.Build.props

Im vorhergehenden Blogartikel wurden die Möglichkeiten von zentralen Projekteinstellungen durch die Datei Directory.Build.props erklärt. Dies kann nun auch genutzt werden, um zentral ein Ruleset zu definieren.

Kopieren Sie auch in diesem Fall die gewünschte Ruleset-Datei an eine zentrale Stelle auf Solutionebene. Legen Sie nun parallel eine Datei mit dem Namen Directory.Build.props an und fügen folgenden Inhalt ein (bzw. ergänzen eine bereits vorhandene Directory.Build.props-Datei entsprechend):

<Project>
<PropertyGroup>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<CodeAnalysisRuleSet>../bIT.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.3.1" />
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.6" />
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="SecurityCodeScan" Version="3.3.0" PrivateAssets="all" />
</ItemGroup>
</Project>

Im obigen Beispiel wird eine zentrale ruleset-Datei mit dem Namen "bIT.ruleset" referenziert. Außerdem werden Warnings als Fehler behandelt und einige Codeanalysis-Assemblies (Microsoft.CodeAnalysis.Csharp, FxCopAnalyzer, StyleCop.Analyzer und SecurityCodeScan) referenziert.

Gerade die zweite Variante bietet ein sehr mächtiges Werkzeug für projektübergreifende Definitionen, sowohl von Codeanalysis-Rules als auch bei Standardreferenzen. Voraussetzung hierfür ist , dass alle Projektdateien im Dateisystem in einer identischen Verschachtelungstiefe liegen.