この記事では、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を適用する方法を説明した。