JetBrains製のC# IDEであるRiderにあるコードインスペクション機能を、そのままコマンドラインで実行できるツールがReSharper Command Line Toolsとして提供されています。 ReSharper Command Line Toolsは、これまでWindows版しかサポートされていませんでしたが、2019.3からはmacOS及びLinuxでも動作するようになりました。
ReSharper Command Line Toolsには、コードインスペクションツールであるInspectCodeのほかにも、重複コードを検出するdupFinder、コードクリーンナップを行なうCleanupCodeが含まれています。 今回はInspectCodeのみ紹介します。
ReSharper Command Line Toolsのインストール
ReSharper Command Line Toolsは、上記サイトからプラットフォームを選んでダウンロードできます。無料で、ライセンスキーも不要です。
ダウンロードしたzipファイルは、任意のディレクトリに展開するだけでokです。ターミナルで直接コマンド実行するのであればPATHを通しておくのも良いでしょう*1。
ツールの実行にUnityエディタは必要ありませんが、ソリューションファイル (.sln) およびプロジェクトファイル (.csproj) が必要です。CIサーバで実行するときにはあらかじめUnityエディタで生成しておく必要があります*2。
InspectCodeの実行
InspectCodeは、以下のように実行できます。Windowsの場合、inspectcode.sh
はinspectcode.exe
に置き換えてください。
$ inspectcode.sh \ $(RESHARPER_TARGET) \ --output=$(LOG_DIR)/inspect.xml \ --format=xml
$(RESHARPER_TARGET)
には、ソリューションファイル (.sln) のパスを指定します。
出力されるxmlファイルは、例えばJenkinsのPMD Pluginなどで表示できます。また引数に--format=html
と指定することでhtml形式でも出力できます。
インスペクション内容の設定
InspectCodeがインスペクションしてくれる項目およびデフォルト設定は、下記ページにまとめられています。
Code Inspections in C# - Help | JetBrains Rider
設定をプロジェクトに合わせてカスタマイズするには、IDE(RiderおよびReSharper)のPreferencesの設定内容をファイル出力し、プロジェクトのルートに置くか、--profile
引数でパスを渡します。
ファイル出力には2種類の方法があります。
設定をteam-sharedとして保存する
Preferencesを変更するとき、"Save"ボタンではなく、その横のプルダウンで"Solution team-shared"を選択します。
すると、プロジェクトのルートに "プロジェクト名.sln.DotSettings" として保存されます。このファイルをリポジトリに追加すれば、CIサーバでも同じ設定でインスペクションを実行できます。
コンピュータの設定をエクスポートする
すでに設定変更を"Save"ボタンで保存していた場合、それはプロジェクトでなくコンピュータ単位の設定ファイルに保存されています。これをエクスポートし、team-shared設定ファイルとして利用できます。
コンピュータ単位の設定をエクスポートするには、Preferencesウィンドウ左下の"Manage Layers"ボタンでPreferences Layersウィンドウを開きます。
"This computer"行を選択し、ツールバーにある"Export to File"アイコンをクリック、Export To Fileウィンドウを開きます。
ここでエクスポートする設定を選択できます。今回はコードインスペクション向けなので"CodeInspection"だけ選択していますが、他の設定もチームで共有したい場合はここで選択し、"OK"ボタンをクリックします。
続いてファイル指定ダイアログが表示されますので、プロジェクトのルートに "プロジェクト名.sln.DotSettings" として保存します。
プラグインの追加
InspectCodeには、.nupkg形式のプラグインを追加することができます。追加は、.nupkgファイルをReSharper Command Line Toolsを展開したディレクトリに入れるだけで完了します。
例えば、先日の記事で紹介した、コードの複雑度を測るプラグインも公開されています*3。
コグニティブ複雑度
サイクロマティック複雑度
こちらはReSharper 2019.3.1で正しく動作しないようです。特にエラーも吐かれていないので設定まわりだと思うのですが、詳細未確認。
まとめ
インスペクションツールの実行はCIに頼るのでなく、IDEに備わっていることで問題の作り込みを早期に防ぐことができます。 その点、RiderやReSharperを使い、かつ警告にきちんと対処していれば、内部品質の高い状態を維持できるはずです。
しかしながら、すでにプロジェクトの内部品質が低くなっている状態から改善していく場合など、CIでメトリクスを採取して変化を監視するのは有効です。ぜひ導入を検討してみてください。
なお、ReSharper Command Line Toolsのマルチプラットフォーム対応については、昨年9月のJetBrains .NET Meetup TokyoおよびCEDEC 2019のJetBrainsブースで「2020.x以降になるだろう」と伺っていたのですが、2019.3に前倒されました。たいへんありがたい。
関連記事
関連書籍

- 作者:ポール・M・デュバル,スティーブ・M・マティアス,アンドリュー・グローバー
- 出版社/メーカー: 日経BP
- 発売日: 2009/08/06
- メディア: 単行本