やらなイカ?

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

JetBrains Rider/ReSharperのNamespace does not correspond to file locationインスペクションをUnityプロジェクトで期待どおり診断させる

JetBrains Rider/ReSharperの提供するコードインスペクションに "Namespace does not correspond to file location" があります。 名前空間ディレクトリ階層と一致していることを検査するものですが、Unityプロジェクトの場合デフォルトでは期待どおりの結果が得られません。

例えば次のようなディレクトリ階層のとき、Foo.csの名前空間Fooに、Bar.csはFoo.Barにしたいはずです。

Assets
└── Foo
   ├── Scripts
   │   ├── Editor
   │   │   └── Foo.Editor.asmdef
   │   └── Runtime
   │       ├── Bar
   │       │   └── Bar.cs
   │       ├── Foo.cs
   │       └── Foo.asmdef
   └── Tests
       ├── Editor
       │   └── Foo.Editor.Tests.asmdef
       └── Runtime
           └── Foo.Tests.asmdef

しかし、デフォルトでは次のように診断されます。

なお、Foo.asmdefのRoot Namespaceプロパティ*1に仮にRootを設定すると、要求される名前空間Root.Foo.Scripts.Runtimeになってしまいます。

回避策(診断の無効化)

回避策として、Namespace does not correspond to file locationインスペクションを無効化する手段もあります。 RiderのPreferencesを開き、Editor | Inspection Settings | Inspection Severityで重大度を下げるか、.editorconfigファイルに次のように設定します。

resharper_check_namespace_highlighting = none

しかしこれでは、本来摘出してほしいケースでも無視されてしまいます。

期待どおり診断させる

期待通りの診断をさせるには、名前空間の組み立てルールをRiderに指示する必要があります。 具体的には、名前空間に含めたくないディレクトScripts, Runtime, Testsを無視するよう設定します*2

Riderで無視させたいフォルダを右クリックしてコンテキストメニューを開き、Properties...をクリックしてFolder Propertiesダイアログを開き、Namespace providerのチェックを外します。

これを無効化したいフォルダすべてに行ないます。 この設定は、プロジェクトのルートディレクトリにアセンブリ名.csproj.DotSettingsというファイル名で保存されますので、忘れずにVCSにコミットします。

UPMパッケージの場合

UPMパッケージの場合、次のようなディレクトリ階層が推奨されています*3

Packages
└── your.package.name
   ├── Editor
   │   └── Foo.Editor.asmdef
   ├── Runtime
   │   └── Foo.asmdef
   └── Tests
       ├── Editor
       │   └── Foo.Editor.Tests.asmdef
       └── Runtime
           └── Foo.Tests.asmdef

診断される名前空間からyour.package.nameは除かれますので、Assets下と同じようにRuntimeTestsを無視するよう設定するだけでは、Runtime下とTests下は名前空間なし、各Editor下はEditorのみとなってしまいます。

そこで、各asmdefのRoot NamespaceFooを設定することで期待どおりの名前空間を得られます。

Create Script Folders and Assemblies with Testsエディタ拡張

Create Script Folders and Assemblies with Testsは、上記のようなRuntime, TestsおよびそれぞれのEditorフォルダを生成、asmdefのAssembly Definition Referencesを適切に設定してくれるエディタ拡張です。

github.com

こちらのv1.2で、本記事にあるNamespace provider設定も行うようにしました。

openupm-cliでインストールできます。

openupm add com.nowsprinting.create-script-folders-with-tests

インストール後、フォルダを作りたいところでコンテキストメニューを開き、Create | C# Script Folders and Assemblies with Testsを選択、フォルダ名を入力すると、フォルダ構成とasmdefそしてDotSettingsファイルが生成されます。

あまり頻繁に使うものでもありませんが、便利ですのでぜひご利用ください。

蛇足

デフォルトで名前空間の解釈をしてほしい、という要望は投げたのですが*4、Unity側のAPIの問題で実現できないそうです…

参考

www.jetbrains.com

www.jetbrains.com

www.jetbrains.com

*1:Unity 2020.2で追加されました

*2:テストの名前空間にTestsを付けるかは好みの問題ですが、私は付けない派

*3:https://docs.unity3d.com/Manual/cus-layout.html

*4:https://youtrack.jetbrains.com/issue/RIDER-87752/Interpretation-of-RootNamespace-is-not-as-expected