CIでUnity向けの静的コード分析を走らせる

あのResharperやRiderで使われている静的コード分析をCI(=コマンドライン)で、それも無料で使えちゃうんです。 CIで実行することで、PullRequestの自動チェックで走らせて未然に事故を防ぐことが出来ます。

静的コード分析って?

コードを分析して、以下のようなことを教えてくれる機能です。

  • nullの可能性がある変数にアクセスしている
  • 実行効率の悪い書き方になっている(同じGetComponentを複数回呼んでいるなど)
  • ネーミングルールの間違い(lowerCamelで書くべきメンバ変数をUpperCamelで書いている等)
  • UnityEngine.Objectに対して?.とか書いちゃってる
  • 絶対true/falseになるif文がないか
  • なんとシェーダーの中身もチェックしてくれる!

などなど。
何よりUnityならではの分析もしてくれるのがめちゃめちゃ便利です。

注意点

  • 2021/04/13現在、UnityExtensionはCommandLineTool 2020.3(最新版は2021)でしか動作しません。 動くようになりました。(2022/01/05)
  • 2021/04/13現在、UnityExtensionはWindows環境でしか動作しません。 動くようになりました。(2024/04/07)

macでもlinuxでも動きます。すごい!!!

インストール

公式の手順

公式のインストール手順はこちら。
dotnet環境が整っていれば、 dotnet tool install -g JetBrains.ReSharper.GlobalTools だけでオッケー

使い方

あとはドキュメント通り使うだけです!
最小ではこんな感じです。

jb inspectcode Project.sln --build --eXtensions=JetBrains.Unity --output=inspectcode.txt

突っ込んでるPluginのコードは対象外にしたい、みたいな時は

--exclude="Assets/**/Generated/**/*.cs"

などとしてやれば除外出来ます。

出力

inspectcode.txtに以下のような出力を得ることができます。
何もない時は Solution Unity\Unity.sln という1行だけ出力されたり、何も出力されなかったりします。(なぜ?)

Solution Unity\Unity.sln
    Project Assembly-CSharp-Editor
      Assets\Scripts\Editor\Hoge.cs:47 Local variable 'a' is only assigned but its value is never used