土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

#Unity プロジェクト+VS2019環境でStyleCop.Analyzersを使用するために必要な4(+1)つの手順

 StyleCopはいわゆるコードの静的解析ツールでして、VS2019の拡張パッケージとして提供されています。マイクロソフトが開発しているオープンソースプロダクトで、C#コードが推奨コーディングスタイルに準拠しているかを常時監視し、準拠していない箇所を指摘してくれて、必要であれば自動修正してくれる優れものです。チェック項目が非常に多く、ユーザーは*.rulesetというファイルでチェック内容を制御できます。

 StyleCop.AnalyzersはStyleCopの後継ツールで、現在はこちらが主流で使用されていると思われます(よく知らない)。StyleCopがコードの自動修正処理にReShaperという有料ツールを別途必要としていたのに対し、StyleCop.Analyzersは単体で全ての機能が利用できます。

 このStyleCop.AnalyzersをUnityのプロジェクトに導入しようとして結構な時間ハマりまして、ようやく解決のメドがついたので記事にまとめました。

参考リンク

 今回の解決策はこちらのフォーラムの投稿にある手順に画像を追加し、適宜補足を入れた物になります。このスレッドのおかげで助かりました……。

Unity and StyleCop.Analyzers(via Unity Forum)
https://forum.unity.com/threads/unity-and-stylecop-analyzers.639784/

前置き:StyleCopを導入しようとしてハマッたトラブル

 VS2019にはNuGetというパッケージ管理ツールが搭載されており、大抵の拡張機能用のパッケージはNuGetを介してダウンロード&インストールすることができます。

 StyleCop.AnalyzersもNuGet経由で導入が可能で、インストール直後からコードのチェックが開始します。しかし、いったんVS2019を閉じて、Unity上で新しい*.csファイルを作成し、それを編集するためにVS2019を再起動すると、インストールした筈のStyleCopが機能しません。これが、導入時にはまったトラブルです。

 この原因なんですが、どうも、UnityがVS2019を起動する際、スクリプトファイル構成の更新を検知すると、自動的に(*.csproj)を再作成するようで(まじか!?)、その際、stylecopを含むパッケージの情報を管理しているPackage.configファイルとのリンクも削除(ファイル自体も消してる?)してしまい、結果的にStyleCopが機能しなくなるようです。これをなんとかすることが本記事の主題です。

注意

 というわけで、今回のポイントはこのパッケージ情報管理データの自動削除を抑制する点にあります。他にもいくつかハマりポイントがあり、実際には「非UnityのVS2019開発環境と同じ運用が可能」という状態には至っていません。その前提でお読みください。

STEP1:StyleCop.Analyzersのインストール(1回だけ実行)

 まずはStyleCop.Analyzersをインストールするわけですが、前準備なしにNuGetでインストールすると先述のトラブルに巻き込まれるので、以下の手順で実行します。

  1. Unityプロジェクトのソリューションを開く(Unity上で*.csファイルを開くとか)
  2. メニューバーの「ツール」から「NuGetパッケージマネージャー」>「パッケージマネージャー設定」を選択
    • f:id:t_tutiya:20191107133832p:plain
  3. オプションダイアログ内で[全般]>[パッケージの管理]>[既定のパッケージ管理形式]リストボックスを"Packages.config"から"PackageReference"に切り替える(これによって、Unityが設定ファイルを削除する現象が起きなくなる)。
    • f:id:t_tutiya:20191107133837p:plain
  4. 「OK」を選択してウィンドウを閉じる
  5. メニューの「ツール」から「NuGetパッケージマネージャー」>「パッケージマネージャーコンソール」を選択。
    • f:id:t_tutiya:20191107133841p:plain
  6. コンソール上で"Install-Package StyleCop.Analyzers"と入力して実行(この文字列をコピペしてOK)
    • f:id:t_tutiya:20191107133849p:plain

 以上です。これにより、StyleCop.Analyzersは正常に機能するようになります。VS2019を再起動しても引き続き動作します。

補足

 ちなみに、コンソールではなくプロジェクトのNuGetパッケージ管理から検索をかけてインストールしても問題ありませんでしたが、いずれにせよ、再起動後からは「インストール済み」のペインにはStyleCop.Analyzersは表示されなくなりました(どこを見れば確認できるんだ?)。

STEP2:RuleSetファイルの作成(1回だけ実行)

 StyleCopはチェック項目が非常に多く、物によっては適用を拒否したい項目もあります。これを設定するためにrulusetファイルを用意します。

  1. 下記サイトからコードをコピペして"StyleCop.Analyzers.ruleset"というファイル名で任意のフォルダに保存する。

 保存先はどこでも良い(筈)です。今現在土屋は検証のためにAssets直下に配置していますが、これは確実によろしくないので、将来的にどうするか検討中です。

補足

 元記事ではVS2019にrulesetファイルを認識させるために、ダミーで作ったプロジェクト経由でrulesetファイルを参照するトリッキーな方法を使っていますが、土屋の環境ではこれは必要ありませんでした。もし上手くいかないようならこちらをためしてみてください。

STEP3:プロジェクトファイルのプロパティを開けるように設定(1回だけ実行)

 作成したrulesetファイルを設定するには、プロジェクトのプロパティから設定する必要があります。しかし、ソリューションエクスプローラーのプロジェクトを右クリックしてプロパティを開こうとすると、何故かなにも起きません。これは、Unity for Toolsがプロジェクトのプロパティ表示を抑制しているためです。なんで!?(毎回再作成されるので、下手に弄れるようにしておきたくないのでしょう)。

 以下の手順で、この抑制を解除します。

  1. メニューの「ツール」から「オプション」を選択。
  2. オプションダイアログ内の「Tooles for Unity」>「その他」>「プロジェクトプロパティへのアクセス」を"false"から"true"に切り替える
    • f:id:t_tutiya:20191107133804p:plain
  3. 「OK」を選択して閉じる。

 これで、ソリューションウィンドウのプロジェクトを右クリックし「プロパティ」を選択するとプロパティが開けるようになります。

STEP4:RuleSetファイルの適用(プロジェクト更新ごとに必要)

 さて、このSTEP4がもっとも重要です。というのも、通常rulesetファイルは一度設定すれば自動的に参照されるのですが、スクリプトの構成が更新されるとUnityがcsprojファイルを上書きしてしまい、この参照設定が消えます。なので、そのたびにrulesetファイルを再設定する必要があります(!)。まあ、そんな大変な作業ではないので、我慢しましょう。

  1. Unityを起動し、任意の.csファイルを開き、VS2019を起動する。
  2. ソリューションエクスプローラーウィンドウでプロジェクトを右クリックし、「プロパティ」を選択。
  3. プロパティウィンドウ内で[コード分析]>[規則セットの構成]>[アクティブな規則]リストボックスを選択
  4. リスト内の[<参照...>]を選択。
    • f:id:t_tutiya:20191107133824p:plain
  5. ファイルダイアログ無いで、StyleCop.Analyzers.rulesetを選択。
  6. Ctrl+Sでcsporojファイルを保存。

 以上でrulesetが認識されます。繰り返しになりますが、この作業はcsprojファイルが更新されるたびに必要です
 ただし、2回目からはリストボックス内に、使用するrulesetファイルに対応する「Rules for StyleCop.Analyzers」が表示されるので、これを選択すればOKです。

補足

 元記事ではソリューションのプロパティから「コード分析設定」を選択する手順になっていましたが、この項目は廃止予定で使用できません。

STEP5:stylecop.jsonの作成と設定(省略)

 元記事ではこのあとstylecoo.jsonの作成と設定にも触れていますが、土屋がまだそこまでやってないので省略します(あとで書きたすかも)。

stylecop.json適用方法について

stylecop.jsonの解説はいずれやる予定なんですが、一個ハマッた箇所を先行で書いておきます。

stylecop.jsonは、StyleCopの"Add StyleCop settings file to the project"という自動修正項目を選択すると、プロジェクトの直下に自動的に作成されます。ところが、これだけではStyleCopの参照対象にならないようで、以下の手順が必要です。

  • ソリューションエクスプローラーでstylecop.jsonをクリック
  • ファイルのプロパティの「ビルドアクション」を「無し」から「AdditionalFiles」に変更
  • プロジェクトを保存。

参考:
Enabling stylecop.json
https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/EnableConfiguration.md

終わりに

 以上になります。StyleCopの使い方については別の記事で書きたいと思っています(土屋も初めて使うのでよくわからない)。

 ここまでやってもrulesetファイルは適宜再設定が必要なわけで、お世辞にも使いやすいと言えません。csprojが再作成される際にパッケージ情報がオミットされるのが問題なわけで、Unity側で対応してくれないと無理なんかなあ……という印象です。Rider買いなさいって事なんでしょうかね。うーん、買うかー。

 ただ、元記事の最後にあった"com.bovinelabs.analyzers"というツールが、どうもプロジェクトファイルを生成しなおす物らしく、これを使えないかどうかについて、もうちょっと調べてみたいと思っています。