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
Unity 2021.2.0
- 内包するMicrosoft.CodeAnalysis.CSharpバージョンがv3.5からv3.9に変更され、Microsoft.CodeAnalysis.CSharp v3.6以降を使ってビルドされたアナライザ*6が動作するようになった
アナライザのスコープ/ .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独自) | - | - | ||
診断の抑止(シンボル) | ○ | - | ||
診断の抑止(行) | ○ | - |
空欄は未検証です
所感
もうなにも信じられない
参考
*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に保存
*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で解消