dotnet-add-analyzers について
既存の .NET プロジェクトにアナライザーを追加するメンテナー向けのスキルガイドです。Roslyn ルール、Nullable 参照型、トリミングと AOT の互換性検査、サードパーティ製アナライザーに加え、段階的な導入方法を扱います。
主な機能
- 01SDK 標準の Roslyn アナライザーを設定
- 02ルールごとの重大度を指定
- 03Nullable 参照型の検査を有効化
- 04トリミングと AOT の互換性を検査
- 05サードパーティ製アナライザーを段階的に追加
活用シーン
- 01既存プロジェクトでコード分析を有効化
- 02アプリ、ライブラリ、テストごとにルールを調整
- 03トリミングや Native AOT 公開前に互換性の問題を確認
- 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 から始め、徐々に厳しくしていきます。
ルールのカテゴリ
| カテゴリ | プレフィックス | 例 |
|---|---|---|
| 設計 | CA1xxx | CA1002(ジェネリックリストを公開しない)、CA1062(引数を検証する) |
| グローバリゼーション | CA1300–CA1399 | CA1304(CultureInfo を指定する) |
| パフォーマンス | CA1800–CA1899 | CA1822(メンバーを static にする)、CA1848(LoggerMessage を使用する) |
| 信頼性 | CA2000–CA2099 | CA2000(オブジェクトを破棄する)、CA2007(ConfigureAwait) |
| セキュリティ | CA2100–CA2199, CA3xxx, CA5xxx | CA2100(SQL インジェクション)、CA3075(XML 処理) |
| 使用法 | CA2200–CA2299 | CA2211(定数でない static フィールド)、CA2245(自分自身に代入しない) |
| 命名 | CA1700–CA1799 | CA1707(識別子にアンダースコアを使用しない) |
| スタイル | IDE0xxx | IDE0003(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.BannedApiAnalyzers | BannedSymbols.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
既存のプロジェクトにアナライザーを追加する
- 組み込みアナライザーを有効にする —
Directory.Build.propsでAnalysisLevelとEnforceCodeStyleInBuildを設定します - 推奨レベルから開始する —
latest-allで警告が多すぎる場合は、latest-recommendedを使用します - EditorConfig のオーバーライドを追加する — プロジェクトの種類に適用されないルールを抑制します
- サードパーティ製アナライザーを追加する — CPM のバージョンを使用して
Directory.Build.targetsから追加します - 段階的に修正する — 既存の警告に対処した後でのみ
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