dotnet-editorconfig について
`.editorconfig` と `.globalconfig` を使った Roslyn のコード分析・スタイルルール設定を解説する .NET 向けガイドです。ルールの重大度や優先順位、プロジェクト間のビルド時適用を調整できます。
主な機能
- 01IDE・CA ルールの設定
- 02ルールの重大度と優先順位
- 03AnalysisLevel とビルド時適用
- 04階層的な EditorConfig 設定
- 05グローバル AnalyzerConfig の解説
活用シーン
- 01リポジトリ全体で分析ルールを統一
- 02CI ビルドでスタイル診断を適用
- 03ディレクトリごとの重大度調整
- 04複数プロジェクトで設定を共有
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ wshaddix/ dotnet-skills --skill dotnet-editorconfigインストール後、Claude Code で/dotnet-editorconfigを入力して読み込まれたか確認します。
詳細
dotnet-editorconfig
.editorconfig およびグローバル AnalyzerConfig ファイルを使用して、.NET のコード分析ルールを設定するための包括的なガイドです。コードスタイルルール(IDE*)、コード品質ルール(CA*)、重大度レベル、AnalysisLevel、EnforceCodeStyleInBuild、ディレクトリ階層の優先順位、.globalconfig ファイルを扱います。
対象範囲の境界: このスキルでは、アナライザールールの設定と調整を扱います。プロジェクトへのアナライザーパッケージの追加については、[skill:dotnet-add-analyzers] を参照してください。カスタムアナライザーの作成については、[skill:dotnet-roslyn-analyzers] を参照してください。プロジェクトレベルのビルド構成(Directory.Build.props、ソリューションの構成)については、[skill:dotnet-project-structure] を参照してください。
相互参照:アナライザーパッケージの追加と AnalysisLevel の設定については [skill:dotnet-add-analyzers]、カスタムアナライザーの作成については [skill:dotnet-roslyn-analyzers]、Directory.Build.props とソリューションの構成については [skill:dotnet-project-structure]、EditorConfig ルールで適用される命名規則と書式規則については [skill:dotnet-csharp-coding-standards] を参照してください。
EditorConfig の概要
.editorconfig は、.NET プロジェクトでコードスタイルと分析ルールの動作を制御するための標準構成ファイルです。.NET コンパイラー(Roslyn)は .editorconfig を読み取り、次の項目を判断します。
- コードスタイルの設定 -- 命名、書式、式レベルのパターン(IDE* ルール)
- コード品質ルールの重大度 -- CA* および IDE* の診断を抑制、引き下げ、または引き上げます
- 書式ルール -- インデント、空白、新しい行
ディレクトリ階層と優先順位
EditorConfig ファイルは階層的に適用されます。コンパイラーはソースファイルからファイルシステムのルートに向かって検索し、見つかった各 .editorconfig の設定を統合します。最も近いファイルが優先されます。つまり、src/MyApp/.editorconfig の設定は、リポジトリルートの .editorconfig にある同じ設定を上書きします。
repo-root/
.editorconfig # Shared baseline (root = true)
src/
.editorconfig # Overrides for production code
MyApp.Api/
.editorconfig # API-specific overrides (if needed)
tests/
.editorconfig # Relaxed rules for test projects
最上位のファイルに root = true を設定すると、上位への検索を停止できます。これを設定しないと、エディターはリポジトリルートより上のユーザーレベルまたはシステムレベルの EditorConfig ファイルまで検索するため、再現性のない動作が発生します。
# repo-root/.editorconfig
root = true
[*.cs]
indent_style = space
indent_size = 4
ファイルの Glob パターン
EditorConfig のセクションでは、Glob パターンを使用して設定の適用対象となるファイルを指定します。
| パターン | 対象 |
|---|---|
[*.cs] | すべての C# ファイル |
[*.{cs,vb}] | C# ファイルと Visual Basic ファイル |
[**/test/**/*.cs] | 任意の test ディレクトリ以下にある C# ファイル |
[Program.cs] | ファイル名が完全に一致するファイル |
コードスタイルルール(IDE*)
IDE ルールは、Roslyn コンパイラーおよび IDE によって適用されるコードスタイルの設定を制御します。dotnet_style_*、csharp_style_*、および dotnet_diagnostic.IDE*.severity のエントリを使用して設定します。
主な IDE ルールのカテゴリ
| 範囲 | カテゴリ | 例 |
|---|---|---|
| IDE0001-IDE0009 | 簡略化 | IDE0001(名前を簡略化)、IDE0003(this. 修飾を削除)、IDE0005(不要な using を削除) |
| IDE0010-IDE0039 | 式の設定 | IDE0016(throw 式)、IDE0017(オブジェクト初期化子)、IDE0018(変数のインライン化)、IDE0028(コレクション初期化子)、IDE0034(default を簡略化)、IDE0039(ローカル関数を使用) |
| IDE0040-IDE0069 | 修飾子とアクセスの設定 | IDE0040(アクセシビリティ修飾子を追加)、IDE0044(readonly を追加)、IDE0062(ローカル関数を static にする) |
| IDE0070-IDE0090+ | パターンマッチングと最新の構文 | IDE0071(補間を簡略化)、IDE0078(パターンマッチングを使用)、IDE0090(new 式を簡略化) |
| IDE0100-IDE0180 | その他の簡略化 | IDE0130(名前空間をフォルダーに合わせる)、IDE0160/IDE0161(ブロック形式とファイル スコープ形式の名前空間) |
| IDE0200-IDE0260 | ラムダとメソッドの設定 | IDE0200(不要なラムダを削除)、IDE0230(UTF-8 文字列リテラルを使用) |
| IDE1005-IDE1006 | 命名ルール | IDE1006(命名ルール違反) |
コードスタイルの設定
[*.cs]
# Expression-level preferences
csharp_style_expression_bodied_methods = when_on_single_line:suggestion
csharp_style_expression_bodied_properties = true:suggestion
csharp_style_expression_bodied_constructors = false:silent
# Pattern matching
csharp_style_prefer_pattern_matching = true:suggestion
csharp_style_prefer_switch_expression = true:suggestion
csharp_style_prefer_not_pattern = true:suggestion
# Null checking
csharp_style_prefer_null_check_over_type_check = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
# var preferences
csharp_style_var_for_built_in_types = false:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = false:suggestion
# Namespace style (.NET 6+)
csharp_style_namespace_declarations = file_scoped:warning
# Using directives
csharp_using_directive_placement = outside_namespace:warning
dotnet_sort_system_directives_first = true
dotnet_diagnostic による IDE ルールの重大度
各 IDE ルールの重大度は個別に設定できます。
[*.cs]
# Enforce removal of unnecessary usings as a build warning
dotnet_diagnostic.IDE0005.severity = warning
# Enforce file-scoped namespaces as a build error
dotnet_diagnostic.IDE0161.severity = error
# Demote new-expression simplification to suggestion
dotnet_diagnostic.IDE0090.severity = suggestion
# Disable this. qualification rule entirely
dotnet_diagnostic.IDE0003.severity = none
コード品質ルール(CA*)
CA ルールは、設計、パフォーマンス、セキュリティ、信頼性、使用方法に関する問題を検出します。.NET SDK に同梱されており、AnalysisLevel で制御します。CA ルールのカテゴリ一覧と AnalysisLevel の設定方法については、[skill:dotnet-add-analyzers] を参照してください。
主な CA カテゴリは次のとおりです。設計(CA1000s)、グローバリゼーション(CA1300s)、相互運用性(CA1400s)、保守性(CA1500s)、命名(CA1700s)、パフォーマンス(CA1800s)、信頼性(CA2000s)、セキュリティ(CA2100s、CA3xxx、CA5xxx)、使用方法(CA2200s)。
CA ルールの重大度設定
[*.cs]
# Suppress rules not applicable to your project type
dotnet_diagnostic.CA1062.severity = none # Nullable handles parameter validation
dotnet_diagnostic.CA2007.severity = none # ConfigureAwait not needed in ASP.NET Core apps
# Escalate important rules
dotnet_diagnostic.CA1822.severity = warning # Mark members as static
dotnet_diagnostic.CA1848.severity = warning # Use LoggerMessage delegates
dotnet_diagnostic.CA2016.severity = warning # Forward CancellationToken
# Error-level for security rules
dotnet_diagnostic.CA2100.severity = error # SQL injection review
dotnet_diagnostic.CA5350.severity = error # Weak cryptographic algorithms
重大度レベル
5 つの重大度レベルによって、診断の報告方法が決まります。
| 重大度 | ビルド出力 | IDE の波線 | エラー一覧 | ビルド失敗(TreatWarningsAsErrors) |
|---|---|---|---|---|
error | はい(エラー) | 赤 | エラータブ | 常に |
warning | はい(警告) | 緑 | 警告タブ | はい(TreatWarningsAsErrors を指定した場合) |
suggestion | いいえ | 灰色の点 | メッセージタブ | いいえ |
silent | いいえ | いいえ | いいえ | いいえ(コード修正は利用できますが、ビルドやエラー一覧には表示されません) |
none | いいえ | いいえ | いいえ | いいえ(ルールは完全に無効になります) |
重大度の一括設定
カテゴリ全体の既定の重大度を設定します。
[*.cs]
# Set all design rules to warning
dotnet_analyzer_diagnostic.category-Design.severity = warning
# Set all performance rules to error
dotnet_analyzer_diagnostic.category-Performance.severity = error
# Set all naming rules to suggestion
dotnet_analyzer_diagnostic.category-Naming.severity = suggestion
dotnet_analyzer_diagnostic.category-{Category}.severity で使用できるカテゴリ名は、Design、Documentation、Globalization、Interoperability、Maintainability、Naming、Performance、SingleFile、Reliability、Security、Usage です。IDE* ルールはカテゴリ単位の一括設定の対象外です。dotnet_diagnostic.IDE*.severity で個別に設定してください。
ルールごとの設定はカテゴリ単位の設定より優先されます。カテゴリ単位の設定は AnalysisLevel の既定値より優先されます。
優先順位(高い順):
- ルール単位:
dotnet_diagnostic.CA1822.severity = error - カテゴリ単位:
dotnet_analyzer_diagnostic.category-Performance.severity = warning AnalysisLevelの基準値(MSBuild プロパティで設定)
AnalysisLevel と EnforceCodeStyleInBuild
AnalysisLevel は、有効になる組み込み CA ルールとその既定の重大度を制御します。値は latest(既定。正確性に関するルールのみ)から latest-all(すべてのルール)まであります。SDK のアップグレード後もルールセットを固定するには、特定の .NET SDK メジャーバージョン(例:8-all、10-all)を指定してください。実験的なルールも含めて最も広範にカバーするには、preview-all を使用してください。AnalysisLevel の値一覧と設定方法については、[skill:dotnet-add-analyzers] を参照してください。
EnforceCodeStyleInBuild
既定では、IDE* ルールは IDE 内でのみ実行され、dotnet build の実行時には実行されません。ビルド時にも適用するには、次のように設定します。
<PropertyGroup>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
</PropertyGroup>
これは CI で適用するうえで非常に重要です。有効にしないと、.editorconfig で警告またはエラーとして設定していても、コードスタイル違反が見逃されます。厳密に適用するには、TreatWarningsAsErrors と組み合わせます。
<PropertyGroup>
<AnalysisLevel>latest-all</AnalysisLevel>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
グローバル AnalyzerConfig ファイル(.globalconfig)
グローバル AnalyzerConfig ファイル(.globalconfig)は、アナライザー設定において .editorconfig の代替となります。ディレクトリに対する相対的な配置は不要で、コンパイル内のすべてのファイルにグローバルに適用されます。
.globalconfig と .editorconfig の使い分け
| 項目 | .editorconfig | .globalconfig |
|---|---|---|
| 範囲 | ディレクトリ相対(ファイル glob セクション) | コンパイル全体(ファイルセクションなし) |
| 階層 | ディレクトリをさかのぼってマージ | フラット(ディレクトリをたどらない) |
| IDE サポート | 完全対応(書式設定、リファクタリング、分析) | 分析ルールのみ |
| 用途 | ディレクトリ単位の書式設定と分析 | プロジェクト間、または NuGet パッケージ間で共有するルール設定 |
.globalconfig の構文
# Filename: .globalconfig (or any name with is_global = true)
is_global = true
# Global level determines priority (higher number = higher priority)
global_level = 100
# Configure rules (same syntax as .editorconfig, without [*.cs] sections)
dotnet_diagnostic.CA1822.severity = warning
dotnet_diagnostic.CA2007.severity = none
dotnet_diagnostic.IDE0005.severity = warning
.globalconfig をプロジェクトに含める
MSBuild の GlobalAnalyzerConfigFiles 項目を使用して参照します。
<ItemGroup>
<GlobalAnalyzerConfigFiles Include="$(MSBuildThisFileDirectory).globalconfig" />
</ItemGroup>
NuGet アナライザーパッケージは、buildTransitive/ に .globalconfig ファイルを含めることで、利用側に既定の重大度を適用できます。
global_level の優先順位
複数の .globalconfig ファイルが適用される場合、global_level の値によってどのファイルが優先されるかが決まります。値が大きいほど優先されます。SDK の既定のグローバル構成では global_level = -1 が使用されます。ユーザー構成では global_level = 0 以上を使用してください(省略した場合の既定値は 0 です)。NuGet に含まれる構成では、ユーザーによる上書きを可能にするため、負の値を使用します。
優先順位の全体像(高い順):
- ルール単位の
.editorconfigエントリ - カテゴリ単位の
.editorconfigエントリ global_levelが最も高い.globalconfigglobal_levelが低い.globalconfig- SDK の既定構成(
AnalysisLevel)
命名規則(IDE1006)
EditorConfig は、ビルド時に命名規則を適用するカスタム命名ルールをサポートしています(EnforceCodeStyleInBuild が有効な場合)。
[*.cs]
# Define symbol groups
dotnet_naming_symbols.public_members.applicable_kinds = property, method, field, event
dotnet_naming_symbols.public_members.applicable_accessibilities = public
dotnet_naming_symbols.private_fields.applicable_kinds = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private
dotnet_naming_symbols.interfaces.applicable_kinds = interface
# Define naming styles
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_naming_style.underscore_prefix.capitalization = camel_case
dotnet_naming_style.underscore_prefix.required_prefix = _
dotnet_naming_style.interface_prefix.capitalization = pascal_case
dotnet_naming_style.interface_prefix.required_prefix = I
# Bind rules (lower number = higher priority)
dotnet_naming_rule.interfaces_must_start_with_i.symbols = interfaces
dotnet_naming_rule.interfaces_must_start_with_i.style = interface_prefix
dotnet_naming_rule.interfaces_must_start_with_i.severity = warning
dotnet_naming_rule.public_members_pascal_case.symbols = public_members
dotnet_naming_rule.public_members_pascal_case.style = pascal_case
dotnet_naming_rule.public_members_pascal_case.severity = warning
dotnet_naming_rule.private_fields_underscore.symbols = private_fields
dotnet_naming_rule.private_fields_underscore.style = underscore_prefix
dotnet_naming_rule.private_fields_underscore.severity = warning
一般的な構成テンプレート
推奨ベースライン(.editorconfig)
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.cs]
# Namespace and using preferences
csharp_style_namespace_declarations = file_scoped:warning
csharp_using_directive_placement = outside_namespace:warning
dotnet_sort_system_directives_first = true
# Code style enforcement in build
dotnet_diagnostic.IDE0005.severity = warning
dotnet_diagnostic.IDE0161.severity = warning
dotnet_diagnostic.IDE0090.severity = suggestion
# CA rule adjustments
dotnet_diagnostic.CA1848.severity = warning
dotnet_diagnostic.CA2016.severity = warning
テストプロジェクトのオーバーライド(tests/.editorconfig)
テストの可読性と競合するルールを緩和するには、tests/ ディレクトリに別の .editorconfig を配置します。プロジェクトの種類(ASP.NET Core アプリ、ライブラリ、テストプロジェクト)ごとの一般的な抑制パターンについては、[skill:dotnet-add-analyzers] を参照してください。
[*.cs]
# Relax rules for test readability
dotnet_diagnostic.CA1707.severity = none # Allow underscores in test names
dotnet_diagnostic.CA1822.severity = none # Test methods often not static
dotnet_diagnostic.IDE0058.severity = none # Expression value is never used
生成コードの構成
ソースジェネレーターやスキャフォールディングツールが生成するコードでは、IDE/CA の警告が発生することがよくあります。生成ファイルの解析を抑制するには、generated_code = true の設定またはファイルのグロブパターンを使用します。
# Suppress warnings in generated code files
[*.g.cs]
generated_code = true
[*.generated.cs]
generated_code = true
generated_code = true を設定すると、Roslyn はそのファイルを生成コードとして扱い、各アナライザーで構成されている GeneratedCodeAnalysisFlags を適用します(多くのアナライザーは既定で生成コードをスキップします)。これは、ソースジェネレーターを使用する場合に特に重要です。詳しくは [skill:dotnet-csharp-source-generators] を参照してください。