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下と同じようにRuntime
とTests
を無視するよう設定するだけでは、Runtime下とTests下は名前空間なし、各Editor下はEditor
のみとなってしまいます。
そこで、各asmdefのRoot Namespace
にFoo
を設定することで期待どおりの名前空間を得られます。
Create Script Folders and Assemblies with Testsエディタ拡張
Create Script Folders and Assemblies with Testsは、上記のようなRuntime, TestsおよびそれぞれのEditorフォルダを生成、asmdefのAssembly Definition Referencesを適切に設定してくれるエディタ拡張です。
こちらの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の問題で実現できないそうです…
参考
*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