mcpField
D
dotnet-add-analyzers

dotnet-add-analyzers

github.com/wshaddixテスト・品質8673 回インストール35 週間前に更新
リポジトリ

dotnet-add-analyzers について

既存の .NET プロジェクトにアナライザーを追加するメンテナー向けのスキルガイドです。Roslyn ルール、Nullable 参照型、トリミングと AOT の互換性検査、サードパーティ製アナライザーに加え、段階的な導入方法を扱います。

主な機能

  1. 01SDK 標準の Roslyn アナライザーを設定
  2. 02ルールごとの重大度を指定
  3. 03Nullable 参照型の検査を有効化
  4. 04トリミングと AOT の互換性を検査
  5. 05サードパーティ製アナライザーを段階的に追加

活用シーン

  1. 01既存プロジェクトでコード分析を有効化
  2. 02アプリ、ライブラリ、テストごとにルールを調整
  3. 03トリミングや Native AOT 公開前に互換性の問題を確認
  4. 04大規模コードベースの警告を段階的に削減

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wshaddix/dotnet-skills --skill dotnet-add-analyzers

インストール後、Claude Code で/dotnet-add-analyzersを入力して読み込まれたか確認します。

詳細

dotnet-add-analyzers

既存のプロジェクトに .NET コードアナライザーを追加して設定します。組み込みの Roslyn CA ルール、Nullable Reference Types の適用、トリミング/AOT 互換性アナライザー、サードパーティ製アナライザーパッケージを扱います。

前提条件: まず [skill:dotnet-version-detection] を実行してください。アナライザーの機能は SDK のバージョンによって異なります。現在のプロジェクト構成を把握するには、[skill:dotnet-project-analysis] を実行してください。

関連項目:[skill:dotnet-project-structure] ではビルドの props/targets の配置場所、[skill:dotnet-scaffold-project] では新規プロジェクトに含まれるアナライザーの設定、[skill:dotnet-editorconfig] では EditorConfig の階層/優先順位、IDE* のコードスタイル設定、命名規則、グローバル AnalyzerConfig ファイルについて説明しています。


組み込みの Roslyn アナライザー

.NET SDK には AnalysisLevel で制御する組み込みアナライザーが含まれています。Directory.Build.props で設定します。

<PropertyGroup>
  <AnalysisLevel>latest-all</AnalysisLevel>
  <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
  <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
AnalysisLevel の値
値動作
latest既定のルールのみ。有効性を対象とし、スタイルは対象外です
latest-minimum既定より少ないルール
latest-recommended既定のルールに推奨ルールを追加
latest-allすべてのルールを有効化。最も包括的です
9-all, 10-all特定の SDK バージョンのルールセット全体に固定

新規プロジェクトには latest-all を推奨します。警告が多い既存プロジェクトでは、latest-recommended から始め、徐々に厳しくしていきます。

ルールのカテゴリ
カテゴリプレフィックス例
設計CA1xxxCA1002(ジェネリックリストを公開しない)、CA1062(引数を検証する)
グローバリゼーションCA1300–CA1399CA1304(CultureInfo を指定する)
パフォーマンスCA1800–CA1899CA1822(メンバーを static にする)、CA1848(LoggerMessage を使用する)
信頼性CA2000–CA2099CA2000(オブジェクトを破棄する)、CA2007(ConfigureAwait)
セキュリティCA2100–CA2199, CA3xxx, CA5xxxCA2100(SQL インジェクション)、CA3075(XML 処理)
使用法CA2200–CA2299CA2211(定数でない static フィールド)、CA2245(自分自身に代入しない)
命名CA1700–CA1799CA1707(識別子にアンダースコアを使用しない)
スタイルIDE0xxxIDE0003(this 修飾)、IDE0063(using 宣言)

EditorConfig の重大度オーバーライド

.editorconfig でルールごとにアナライザーの重大度を調整します。

[*.cs]
# Suppress specific rules
dotnet_diagnostic.CA1062.severity = none          # Nullable handles this
dotnet_diagnostic.CA2007.severity = none          # Not needed in ASP.NET Core apps

# Escalate to error
dotnet_diagnostic.CA1822.severity = error         # Mark members as static
dotnet_diagnostic.CA1848.severity = warning       # Use LoggerMessage delegates

# Style enforcement
dotnet_diagnostic.IDE0005.severity = warning      # Remove unnecessary usings
dotnet_diagnostic.IDE0063.severity = warning      # Use simple using statement
dotnet_diagnostic.IDE0090.severity = warning      # Simplify new expression
プロジェクトの種類別の一般的な抑制

ASP.NET Core アプリ — ConfigureAwait の警告を抑制します。

dotnet_diagnostic.CA2007.severity = none

ライブラリ — 呼び出し元に SynchronizationContext がない場合があるため、CA2007 を警告として維持します。

dotnet_diagnostic.CA2007.severity = warning

テストプロジェクト — 一部のルールを緩和します。

dotnet_diagnostic.CA1707.severity = none          # Allow underscores in test names
dotnet_diagnostic.CA1062.severity = none          # Parameters validated by test framework
dotnet_diagnostic.CA2007.severity = none          # ConfigureAwait not relevant

Nullable Reference Types

Directory.Build.props でグローバルに有効化します。

<PropertyGroup>
  <Nullable>enable</Nullable>
</PropertyGroup>

Nullable 解析では CA ルールではなく、警告(CS86xx)が生成されます。関連する設定:

<PropertyGroup>
  
  <WarningsAsErrors>$(WarningsAsErrors);nullable</WarningsAsErrors>
</PropertyGroup>

既存のコードベースに段階的に導入するには、ファイルごとに有効化します。

#nullable enable

注釈の戦略とパターンについては、[skill:dotnet-csharp-nullable-reference-types] を参照してください。


トリミングおよび AOT 互換性アナライザー

アプリケーション

トリミングまたは Native AOT を使用して発行するアプリでは、発行プロパティとともにアナライザーを有効化します。

<PropertyGroup>
  
  <PublishTrimmed>true</PublishTrimmed>
  <EnableTrimAnalyzer>true</EnableTrimAnalyzer>

  
  <PublishAot>true</PublishAot>
  <EnableAotAnalyzer>true</EnableAotAnalyzer>

  
  <EnableSingleFileAnalyzer>true</EnableSingleFileAnalyzer>
</PropertyGroup>

トリミングしたアプリを発行する前でも、開発中に問題を検出できるよう、アナライザーを早めに有効化してください。EnableTrimAnalyzer と EnableAotAnalyzer は、PublishTrimmed/PublishAot とは独立して設定できます。

ライブラリ

ライブラリでは IsTrimmable と IsAotCompatible を使用して、コンシューマーに互換性を宣言します。コンシューマーがまだトリミングを行っていなくても、これらを有効にしてください。

<PropertyGroup>
  <IsTrimmable>true</IsTrimmable>
  <IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>

IsTrimmable/IsAotCompatible を設定すると、対応するアナライザーが自動的に有効化されます。これにより、コンシューマーが将来的にトリミング/AOT を有効化した場合でも、ライブラリが正しく動作することを確認できます。

アナライザーが警告する内容

これらのアナライザーは、次の問題を警告します。

  • トリミングに支障をきたすリフレクションの使用(IL2xxx 警告)
  • AOT と互換性のない P/Invoke パターン
  • 動的コード生成(Reflection.Emit、System.Linq.Expressions のコンパイル)
  • [DynamicallyAccessedMembers] で注釈されていない型

サードパーティ製アナライザー

すべてのプロジェクトに適用されるよう、Directory.Build.targets から追加します。


<Project>
  <ItemGroup>
    <PackageReference Include="Meziantou.Analyzer" PrivateAssets="all" />
    <PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" PrivateAssets="all" />
  </ItemGroup>
</Project>

CPM を使用する場合は、Directory.Packages.props にバージョンエントリを追加します。

<PackageVersion Include="Meziantou.Analyzer" Version="2.0.187" />
<PackageVersion Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.11.0-beta1.25058.1" />
推奨アナライザーパッケージ
パッケージ対象
Meziantou.Analyzerセキュリティ、パフォーマンス、ベストプラクティス(幅広い範囲をカバー)
Microsoft.CodeAnalysis.BannedApiAnalyzersBannedSymbols.txt を使って特定の API を禁止
Microsoft.CodeAnalysis.PublicApiAnalyzersパブリック API サーフェスを追跡(ライブラリの作成者向け)
SonarAnalyzer.CSharpセキュリティ、信頼性、保守性
BannedSymbols.txt

BannedApiAnalyzers を使用する場合は、リポジトリのルートに BannedSymbols.txt を作成して追加します。


<ItemGroup>
  <AdditionalFiles Include="$(MSBuildThisFileDirectory)BannedSymbols.txt"
                   Condition="Exists('$(MSBuildThisFileDirectory)BannedSymbols.txt')" />
</ItemGroup>

BannedSymbols.txt の例:

T:System.DateTime;Use DateTimeOffset instead
M:System.DateTime.Now;Use DateTimeOffset.UtcNow instead
T:System.GC;Do not call GC methods directly

既存のプロジェクトにアナライザーを追加する

  1. 組み込みアナライザーを有効にする — Directory.Build.props で AnalysisLevel と EnforceCodeStyleInBuild を設定します
  2. 推奨レベルから開始する — latest-all で警告が多すぎる場合は、latest-recommended を使用します
  3. EditorConfig のオーバーライドを追加する — プロジェクトの種類に適用されないルールを抑制します
  4. サードパーティ製アナライザーを追加する — CPM のバージョンを使用して Directory.Build.targets から追加します
  5. 段階的に修正する — 既存の警告に対処した後でのみ TreatWarningsAsErrors を有効にするか、対処中のカテゴリに対して一時的に <NoWarn> を使用します
段階的な導入パターン

大規模なコードベースでは、すべての警告を一度に修正するのは避けてください。


<PropertyGroup>
  <AnalysisLevel>latest-recommended</AnalysisLevel>
  
  <NoWarn>$(NoWarn);CA1822;CA1848</NoWarn>
</PropertyGroup>

各カテゴリに対処したら、NoWarn のエントリを削除します。次の方法で進捗を追跡します。

dotnet build 2>&1 | grep -oE 'CA[0-9]+' | sort | uniq -c | sort -rn

参考資料

コメント