Edited at

dotnet-formatでC#ソースコードを整形する


はじめに

roslynのリポジトリを見ていたら、dotnet-formatなるツールがあって、ちょうど良さそうなツールだったので紹介してみる。


なぜ必要か

昨今IDEの発達により、ソースコードのかなりの部分が自動的に整形されるようになり、あまり自分のコーディングスタイルというものを意識しない人も増えてきたと思う。

しかし、それでも自分でも無意識のうちに持っているコーディングスタイルというものはどうしても存在する。

一人で開発しているうちは好きにしたらいいと思うが、これが複数人での開発となると、各々のコーディングスタイルの違いから、本来の修正以上の差分が発生してノイズになってしまう場合がある。

特にIDEの設定が各々異なるものを持っていた場合、自動的に整形されて余計な差分だらけになってしまうという悲劇はある(あった)。

対策として、EditorConfigを設定するという手があるが、現状対応していないエディタというのもあるにはある。

また、都度都度エディタに任せて変換するよりも、コミット時に、確認の意味も含めて一括で変換したい場合もあるだろう。

そこで、そういう時は今回紹介するdotnet-formatが役に立つんじゃないかと思う。


インストール


事前準備

dotnet-formatは .NET Core グローバルツールとして作られている。

また、内部的にmsbuildも使用しているため、dotnet-sdk 2.1以降が必要となる。


インストールの実行

READMEにも書いてあるが、コマンドプロンプトで下記コマンドを実行する。


安定版、またはプレリリースバージョンを入れる場合

dotnet tool install -g dotnet-format --version [パッケージバージョン]と入力すれば良い。

使えるバージョンは、dotnet-formatのページを参照


開発版を入れる場合

dotnet tool install -g dotnet-format --version [NuGetバージョン] --add-source https://dotnet.myget.org/F/roslyn/api/v3/index.json

実行後、dotnet format --helpでヘルプが出力されればOK。されない場合、PATHが通っているか確認すること(Winの場合、%USERPROFILE%\.dotnet\tools、LinuxとMacの場合は$HOME/.dotnet/tools)。

バージョン番号は、実際にroslynのmygetサイトを見て確認すること。

この方法でインストールした場合、最新のものを使用可能だが、代わりに予期しない不具合や、仕様変更等があるかもしれないので注意すること。


使い方


EditorConfigの作成

基本的に無ければデフォルトの設定で動作するが、そのままだとunsetで何もしない設定がかなり多いため、予め作成しておいた方がいいだろう。

.editorconfigは基本的にslnファイルと同じ場所に置くのが良いと思う。基本的な書き方はEditorConfig本サイトや、それこそ"EditorConfig"で検索すればかなりの数出てくると思うので、ここで説明はしない。

C#独自の設定項目としては、MS公式サイトが参考になる。ただし、自分が試した限りでは使えるのは書式規則だけで、言語コード スタイル等は使えなかったので注意してほしい。この辺り、使えた人がいたら情報求む。

後、charsetとend_of_lineも挙動が怪しかった(効いてなさそう)ので、多少注意が必要だろう。

この辺りはdotnet-formatの問題というよりは、ソースを見る限りはroslynのWorkspace.TryApplyChanges辺りの問題と思われる。


使用可能な設定

dotnet-formatで使用可能な設定の一覧は、下記URLに記載してある。

https://github.com/dotnet/format/wiki/Supported-.editorconfig-options


フォーマットの実行

フォーマットの実行は、dotnet format -w [ソリューションファイル又はプロジェクトファイル]で良い。

実行すると、ソリューション配下またはプロジェクト配下のC#ソースとVBソース全てに整形が適用される。

F#ソースやXML等その他のファイルには適用されないことに注意。


対象ファイルの絞込

デフォルトではプロジェクト配下全てのファイルを対象にするが、3.0.4からは--filesオプションが有効になり、これによって対象ファイルを明示的に指定できるようになった。

複数指定する場合は、,で区切る。

ただし、今の所対象外ファイルの指定や、ワイルドカード等は使えない模様。


終りに

dotnet-formatは、フォーマットしかしない。この点、gofmt等と比べると不足を感じるかもしれないが、それでも単機能ツールとしては十分だと思う。

複数人プロジェクトで開発する時、PRレビュー等で書式関連の余計なノイズを減らしたいという場合は、検討してみるのもいいのではないかと思う。