C#でコードスタイル規則のエラーをビルドエラーにする
C#でvar
での変数宣言を強制したい。でも、有名どころのStyleCopAnalyzerやRoslynatorには、そのようなルールがない(たくさんのルールがあるので見逃してるだけかもしれないが。)
一方、コードスタイル規則ってのがある。.editorconfig
で設定を行うと、プロジェクトで共有できてVisual Studio上でもその内容が反映される。エラーを指定した設定項目に一致するコードが見つかったら赤の下線が引かれたりする。残念ながらVS Codeではうまく反映してくれなかったけど、Visual StudioとかRiderだったら反映してくれた。
.editorconfig
に次のように設定すると、
[*.cs]
csharp_style_var_elsewhere = true:error
csharp_style_var_for_built_in_types = true:error
csharp_style_var_when_type_is_apparent = true:error
Visual Studioはこんな風に反応してくれる。
ただ、残念ながらこれはエディタの表示上の話で、ビルドしてもエラーなく成功してしまう。これをエラーにしたい。
どうやらできるらしい。
手順にしたがってやっていく。
- MSBuildプロパティ
EnforceCodeStyleInBuild
をtrue
に設定します。.editorconfig
ファイルで、ビルド時に実行する各 "IDE" コードスタイルルールを警告またはエラーとして構成します。
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
[*.cs]
csharp_style_var_elsewhere = true:error
csharp_style_var_for_built_in_types = true:error
csharp_style_var_when_type_is_apparent = true:error
# IDE0007: 暗黙的な型の使用
dotnet_diagnostic.IDE0007.severity = error
無事にビルドエラーになった。
追加で試してみた
いくつか気になったので追加で試してみた。
ルールIDの設定だけでビルドエラーになるのか?
.editorconfig
で、csharp_style_var_elsewhere
とかオプションの指定を外して、ルールID(ここではIDE0007
)の指定だけにしても、ビルドエラーになるのか?
[*.cs]
# csharp_style_var_elsewhere = true:error
# csharp_style_var_for_built_in_types = true:error
# csharp_style_var_when_type_is_apparent = true:error
# IDE0007: 暗黙的な型の使用
dotnet_diagnostic.IDE0007.severity = error
ならなかった。
error
以外にしてもビルドエラーになるのか?
オプションの指定を.editorconfig
で、csharp_style_var_elsewhere
とかオプションの指定をerror
以外にしても、ビルドエラーになるのか?
[*.cs]
csharp_style_var_elsewhere = true:info
csharp_style_var_for_built_in_types = true:silent
csharp_style_var_when_type_is_apparent = true:none
# IDE0007: 暗黙的な型の使用
dotnet_diagnostic.IDE0007.severity = error
こまかいことは書かないが、無指定とnone
以外はビルドエラーになった。でもややこしいのであわせておくのがベターだと思う。
Microsoft.CodeAnalysis.CSharp.CodeStyle
を直接参照してもビルドエラーにできるか?
どうやら、EnforceCodeStyleInBuild
をtrue
にすると、Microsoft.CodeAnalysis.CSharp.CodeStyle
が参照され、そいつがビルドエラーにしている模様。なので、EnforceCodeStyleInBuild
を指定せずにNuGetからMicrosoft.CodeAnalysis.CSharp.CodeStyle
を直接参照するとどうなるのか。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<None Include="..\.editorconfig" Link=".editorconfig" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.CodeStyle" Version="3.9.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>
ちゃんとビルドエラーになった。でもドキュメントにはEnforceCodeStyleInBuild
をtrue
にしろってなってるので、そっちに従っておいたほうが、今後を考えてもベターなような気はする。
Discussion