やらなイカ?

たぶん、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が反映されるようになった
  • Roslyn AnalyzerがあるとDeterministic Compilationが効かなくなる問題*2が修正された*3
  • Roslyn Analyzerによる重要度Errorの検出がある状態でAssets | Open C# Projectを実行してもslnおよびcsprojファイルが生成(更新)されない問題が修正された*4

Unity 2021.1.2

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

Unity 2021.2.0

  • 内包するMicrosoft.CodeAnalysis.CSharpバージョンがv3.5からv3.9に変更され、Microsoft.CodeAnalysis.CSharp v3.6以降を使ってビルドされたアナライザ*6が動作するようになった

Unity 2022.1.0

  • 内包するMicrosoft.CodeAnalysis.CSharpバージョンがv3.9からv3.11に変更された [2024-02-29 追記]

アナライザのスコープ/ .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の依存関係を反映) *7 *8 → ○*9 *10 → ○*11 *12 → ○*13
Assetsフォルダ下のDLLs - → ○*14
Embedded package下のDLLs *15 ☓ → ○ *16 - → ○*17
Local package, UPM registry or Git URLから取得したPackage下のDLLs ☓ → ○ *18 *19 → ○*20 *21 → ○*22 - → ○*23

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
診断実行 *24
重要度設定(.ruleset) *25 ☓ → ○*26
重要度設定(.editorconfig)
重要度設定(IDE独自) - *27
診断の抑止(シンボル) *28
診断の抑止(行)*29 ☓ → ○ *30
特定のアナライザ*31 ☓ → ○ *32

空欄は未検証です

CLIでの診断実行

Unity 2020.2+ Batchmode JetBrains ReSharper CLT 2021.1 dotnet build Standalone Analyzer
診断実行 *33 *34
重要度設定(.ruleset) ☓ → ○ *35 -
重要度設定(.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:検証プロジェクト https://github.com/nowsprinting/DeterministicCompilationWithRoslynAnalyzer

*3:Unity 2020.3.26f1では修正されていない

*4:Unity 2020.3.27f1では修正されていない

*5:Unity 2020.3.6にバックポートされた

*6:Microsoft.Unity.AnalyzersやNUnit.Analyzers

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

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

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

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

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

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

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

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

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

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

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

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

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

*20:v3.0.9で対応

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

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

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

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

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

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

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

*28:SuppressMessageアトリビュート

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

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

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

*32:Unity 2021.2で解消

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

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

*35:Unity 2021.1で解消