やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

Unity 2020.2時点のRoslyn Analyzerサポート状況まとめ

Unity 2020.2でRoslynアナライザによる静的解析が動作するようになりました。しかし、まだ色々と制限があるようなので現時点のサポート状況を検証してまとめてみました。

検証に使用したプロジェクト も公開していますので、認識違い等あれば教えていただると嬉しいです。

Unity 2020.2以降の主な更新内容

Unity 2020.3.4

  • Packages下(Embedded package, Local package, Package from UPM registry/ Git URL)かつAssembly Definition File (.asmdef) 管理下のアナライザDLLが認識されるようになった
  • 通常のコンパイルステップで診断が実行されるようになった(以前はファイル更新かReimport契機)

Unity 2020.3.6

  • IDEsプラグインパッケージの対応バージョン*1との組み合わせで、IDEsでもAnalyzer Scope(asmdefの依存関係を反映した適用範囲)が機能するようになった(2021.1.2からのバックポーティング)

Unity 2021.1.0

  • Rulesetの変更が即時反映されるようになった(Unity 2020ではReimportが必要)
  • BatchmodeでビルドするときにもRulesetが反映されるようになった

Unity 2021.1.2

  • IDEsプラグインパッケージの対応バージョンとの組み合わせで、IDEsでもAnalyzer Scope(asmdefの依存関係を反映した適用範囲)が機能するようになった

Unity 2021.2.0

  • 一部適用されないアナライザ*2の制限が解消された

アナライザのスコープ/ .csprojへの反映

Unity 2020.2+ JetBrains Rider Editor v2.0.6+ Code Editor Package for Visual Studio Code v1.2.0+ Code Editor Package for Visual Studio v2.0.7
Analyzer Scope (asmdefの依存関係を反映) *3 *4 → ○*5 *6 → ○*7 *8 → ○*9
Assetsフォルダ下のDLLs - → ○*10
Embedded package下のDLLs *11 ☓ → ○ *12 - → ○*13
Local package, UPM registry or Git URLから取得したPackage下のDLLs ☓ → ○ *14 *15 → ○*16 *17 → ○*18 - → ○*19

Unity 2020.2+ 列は、Unity Editor GUIで診断実行する際のアナライザのスコープ(適用範囲)について。

その他は、Assets | Open C# Project でIDEを開くときに生成される.csprojへの反映状況です。 JetBrains Rider Editorはv2.0.6で、Visual Studio Code Editorはv1.2.0で、Unityエディタ向けに設定されたRoslynアナライザのDLLがあると.csprojに <Analyzer> ノードが追加されるようになっています。

Unityエディタ (GUI) / IDEでの診断実行

Unity 2020.2+ JetBrains Rider 2021.1 VSCode VS 2019
診断実行 *20
重要度設定(.ruleset) *21 ☓ → ○*22
重要度設定(.editorconfig)
重要度設定(IDE独自) - *23
診断の抑止(シンボル) *24
診断の抑止(行)*25 ☓ → ○ *26
特定のアナライザ*27 ☓ → ○ *28

空欄は未検証です

CLIでの診断実行

Unity 2020.2+ Batchmode JetBrains ReSharper CLT 2021.1 dotnet build Standalone Analyzer
診断実行 *29 *30
重要度設定(.ruleset) ☓ → ○ *31 -
重要度設定(.editorconfig) -
重要度設定(IDE独自) - -
診断の抑止(シンボル) -
診断の抑止(行) -

空欄は未検証です

所感

もうなにも信じられない

参考

docs.unity3d.com

forum.unity.com

github.com

docs.microsoft.com

docs.microsoft.com

*1:JetBrains Rider Editor v3.0.9+, Code Editor Package for Visual Studio Code v1.2.4+, Code Editor Package for Visual Studio v2.0.11+

*2:NUnit.Analyzersが適用されない。要因は不明

*3:https://docs.unity3d.com/2020.2/Documentation/Manual/roslyn-analyzers.html

*4:asmdefの依存関係に関わらず、全てのアナライザが全ての.csprojに設定される

*5:v3.0.9で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*6:asmdefの依存関係に関わらず、全てのアナライザが全ての.csprojに設定される

*7:v1.2.4で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*8:常に /Applications/Visual Studio.app/Contents/Resources/lib/monodevelop/AddIns/MonoDevelop.Unity/Analyzers/Microsoft.Unity.Analyzers.dll だけが追加される

*9:v2.0.11で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*10:v2.0.11で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*11:https://docs.unity3d.com/2020.2/Documentation/Manual/roslyn-analyzers.html に記述のある、Plugin Inspectorでラベルの設定がPackages下のDLLでは表示されないため、Assets下でラベル設定した後にPackages下に移動して検証しています

*12:Unity 2020.3.4で解消(Release notesおよびIssue trackerには記載なし)。なお、Unity 2020.3.3以前でもasmdef下にないDLLは有効

*13:v2.0.11で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*14:Unity 2020.3.4で解消(Release notesおよびIssue trackerには記載なし)。なお、Unity 2020.3.3以前でもasmdef下にないDLLは有効

*15:.csprojに<Analyzer>ノードは追加されるが、パスがUnityエディタ上のPackages下を指すためDLLの実体が無く無効

*16:v3.0.9で対応

*17:.csprojに<Analyzer>ノードは追加されるが、パスがUnityエディタ上のPackages下を指すためDLLの実体が無く無効

*18:v1.2.4で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*19:v2.0.11で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*20:Unity 2020.2では診断は当該ファイルのコンパイルもしくはReimportの契機でのみ実行されたが、Unity 2020.3.4で通常のコンパイルステップで動作するよう変更された

*21:Unity 2020では変更を反映するのにReimportが必要だったが、Unity 2021.1でRuleset適用タイミングを早める修正が入ったことによりこの問題も解消

*22:Rider Editor package v3.0.9で対応

*23:Preferences...で設定して.sln.DotSettingsに保存

*24:SuppressMessageアトリビュート

*25:#pragma warning disable/restoreディレクティブ

*26:Rider 2021.1以前ではクイックフィックス候補に"// ReSharper disable"が出るが、Roslynアナライザの診断結果には無効。Rider 2021.2 EAP1以降で"Disable with #pragma"が選択可能になった

*27:NUnit.Analyzersが適用されない。要因は不明

*28:Unity 2021.2で解消

*29:ビルドログに出るのでパースが必要

*30:https://youtrack.jetbrains.com/issue/RSRP-480257 voteしましょう

*31:Unity 2021.1で解消