dotnet formatコマンドをStyleCop.Analyzersと組み合わせて使う

この記事では、dotnet formatコマンドを使ってC# Coding Styleにそってソースコードをフォーマットする方法と、その限界を説明する。そして、StyleCop.Analyzersを導入して、それを克服する方法を紹介する。また、ソリューション内のすべてのプロジェクトに、StyleCop.Analyzersを適用する方法についても言及する。

dotnet format

dotnet formatは一定のルールセットに従って、プロジェクトまたはソリューション内のすべてのソース コードを一度にフォーマットできる。.NET SDK バージョン 6.0以降はデフォルトでインストールされている。

dotnet formatは.editorconfigファイルからルールセットを読み込む。.editorconfigは対象のプロジェクトかソリューションフォルダー、あるいはその上のフォルダーに置く。C# Coding Styleに従ってソースコードをフォーマットする場合、.NET Runtimeリポジトリにあるこの.editorconfigを利用できる.

dotnet formatをこの.editorconfigについて使用する場合、severityとしてinfoを指定する必要がある。そうしないと、dotnet formatはほとんどのルールを無視してしまう。

上記のコマンドは、次のコードをその次のようにフォーマットする。

この結果は十分ではない。C# Coding Styleに反して、メソッド名はcamelCaseのままであり、if文は1行のままであり、不必要な空行も残っている。

StyleCop.Analyzers

よりC# Conding Styleにそった結果を得るには、StyleCop.Analyzersを利用するとよい。StyleCop.Analyzersを利用すると、もともとVisual StudioのStyleCopという拡張機能で提供されていた、StyleCopルールセットをソースコードに適用できる。

StyleCop.Analyzersを使用してプロジェクト内のソースコードをフォーマットする場合、以下のようにStyleCop.Analyzersパッケージをプロジェクトに追加する。それだけでdotnet formatはStyleCop.Analyzersを使うようになる。

特に設定せずにStyleCop.Analyzersを使用すると、C# Coding Styleに沿っていないデフォルトのルールセットが用いられる。これを修正するには、StyleCop.Analyzersリポジトリからデフォルト ルールセットファイルをダウンロードして、調整する必要がある。

ダウンロードしたルールセットファイルに以下のdiffを適用すると、SyleCop.AnalyzersはおおむねC# Coding Styleに沿うようになる。適用済みのファイルは、私のGitHubリポジトリからダウンロードできる。

カスタマイズしたルールセットファイルをstylecop.rulesetとして保存したら、プロジェクトファイルに以下の行を追加すると、StyleCop.Analyzersがこれを読み込んで動作する。

指定したルールセットを用いてソースコードをフォーマットするには、上に示したのとまったく同じようにdotnet format --severity infoと実行すればよい。これを実行すると以下のような、よりC# Style Guideにそった結果が得られる。

Directory.Build.props

ソリューション フォルダー内のすべてのプロジェクトをフォーマットする必要がある場合、StyleCop.Analyzersパッケージを各プロジェクトに追加する必要がある。しかし、Directory.Build.propsファイルを使うとこの手間を省くことができる。

ソリューション フォルダにDirectory.Build.propsを配置すると、MSBuild はこのファイルを各プロジェクト ファイルの先頭にインポートする。つまり、以下のDirectory.Build.propsファイルをソリューションフォルダに配置することで、全てのプロジェクトでStylecop.Analyzersが利用可能になる。

stylecop.rulesetを指定する際に、MSBuildThisFileDirectory変数を用いていることに注意してほしい。この変数の値はDirectory.Build.propsがあるディレクトリである。これにより、どの深さのディレクトリにあるプロジェクトでも、StyleCop.Analyzersがルールセットファイルを読むことができる。

まとめ

この記事では、StyleCop.Analyzersと組み合わせてdotnet formatコマンドを使用する方法を説明した。StyleCop.Analyzersによって、dotnet format単体よりもC# Coding Styleに近い結果を得られるようになる。さらにDirectory.Build.propsを用いて、ソリューションフォルダー内のすべてのプロジェクトにStyleCop.Analyzersを適用する方法を説明した。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です