Extenject / UniRx / UniTaskをPackage Managerで扱いたい

# はじめに

Package Managerでパッケージの導入が楽になったのでよく使うライブラリでも使えないかと調べた所、各リポジトリは後述するPath Queryに対応していました。

各リポジトリのUPMのgit URLと対応状況

- Extenject  
package.jsonとasmdefは用意されていますが正式対応版ではなくサンプルシーンも一緒に取り込まれてしまうので使わない方が無難です。
- UniRx  
masterブランチのみUPM対応しています。UPM対応後にタグが作られていないのでバージョン指定はできません。
- UniTask  
masterブランチと1.3.0以降のタグを指定できます。タグを指定する場合は`#1.3.0`のようにURLの最後に追加します。
    - `https://github.com/Cysharp/UniTask.git?path=Assets/UniRx.Async#1.3.0`

```json:Packages/manifest.json
{
  "dependencies": {
    "com.svermeulen.extenject": "https://github.com/svermeulen/Extenject.git?path=/UnityProject/Assets/Plugins/Zenject",
    "com.neuecc.unirx": "https://github.com/neuecc/UniRx.git?path=Assets/Plugins/UniRx/Scripts",
    "com.cysharp.unitask": "https://github.com/Cysharp/UniTask.git?path=Assets/UniRx.Async",
    ...
  }
}
```


UnityのPackage ManagerにPath Queryが追加される前に有志がUPM対応したりレジストリを建てたものもありますのでまとめました。

# 有志がUPM化したものを利用

Extenjectはissueにコメントされていたものです。

- https://github.com/starikcetin/awesome-upm
    - https://github.com/starikcetin/Extenject

```json:Packages/manifest.json
{
  "dependencies": {
    "com.svermeulen.extenject": "https://github.com/starikcetin/Extenject.git#9.1.0",
    ...
  }
}
```

# Unofficial Unity Package Manager Registryを利用

もんりぃ先生(@monry)が建てたUnofficial Unity Package Manager Registryにもパッケージが登録されているのでこちらを利用する事もできます。
詳細は以下のリンクをご覧下さい。

- [Unofficial Unity Package Manager Registry を建ててみました](https://monry.hatenablog.com/entry/2019/06/06/204840)
- [パッケージを利用する](https://docs.upm-packages.dev/ja/usage)
- [Unofficial Unity Package Manager Registry](https://upm-packages.dev/)
    - https://upm-packages.dev/-/web/detail/com.stevevermeulen.extenject
    - https://upm-packages.dev/-/web/detail/jp.cysharp.unirx
    - https://upm-packages.dev/-/web/detail/jp.cysharp.unitask

こっちはパッケージを利用する方法に従って`manifest.json`に以下の内容を追加します。

```json:Packages/manifest.json
{
  "scopedRegistries": [
    {
      "name": "Unofficial Unity Package Manager Registry",
      "url": "https://upm-packages.dev",
      "scopes": [
        "com.stevevermeulen",
        "jp.cysharp"
      ]
    }
  ],
  "dependencies": {
      "com.stevevermeulen.extenject": "9.1.0",
      "jp.cysharp.unirx": "7.1.0",
      "jp.cysharp.unitask": "1.0.0",
      ...
  }
}
```

更にExtenjectのバージョンの枝番に`-5`、`scopes`に`dev.upm-packages`を追加するとテスト用のMoqとNSubstituteを一緒にインストールできます。

```json:Packages/manifest.json
{
  "scopedRegistries": [
    {
      "name": "Unofficial Unity Package Manager Registry",
      "url": "https://upm-packages.dev",
      "scopes": [
        "com.stevevermeulen",
        "jp.cysharp",
        "dev.upm-packages"
      ]
    }
  ],
  "dependencies": {
      "com.stevevermeulen.extenject": "9.1.0-5",
      "jp.cysharp.unirx": "7.1.0",
      "jp.cysharp.unitask": "1.0.0",
      ...
  }
}
```

# Path query parameter (Subfolder)

Unity2020.1a21とUnity2019.3.4f1から`package.json`をサブフォルダに配置できるようになりました。既存構成のままupm化できるようになったので開発元が対応すると利用できるようになります。

たとえばExtenjectは以下のように指定すればPackage Managerから扱えますが上述したようにバグがありコンパイルエラーになります。

```json:Packages/manifest.json
{
  "dependencies": {
    "com.svermeulen.extenject": "https://github.com/svermeulen/Extenject.git?path=/UnityProject/Assets/Plugins/Zenject",
    ...
  }
}
```

まだ`package.json`が追加された後にタグが作られてませんが以下のようにハッシュを直接指定すると固定できます。

```json:Packages/manifest.json
{
  "dependencies": {
    "com.svermeulen.extenject": "https://github.com/svermeulen/Extenject.git?path=/UnityProject/Assets/Plugins/Zenject#a955dd60be11d9a1f92080cda1d87e425c519072",
    ...
  }
}
```

https://forum.unity.com/threads/some-feedback-on-package-manager-git-support.743345/#post-5425311

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Unity 2019.3.4f1 から Unity Package Manager が「Git リポジトリのルート以外に package.json がある場合」もサポートしてくれるようになりました。<a href="https://t.co/gChvsXmgjb">https://t.co/gChvsXmgjb</a><br>こんな感じに `?path=...` とパスを指定してあげれば良いようです。<br>（内部的に clone してから当該パス以下を読んでる？）</p>&mdash; もんりぃ先生 (@monry) <a href="https://twitter.com/monry/status/1235973803823337473?ref_src=twsrc%5Etfw">March 6, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/95bea72d-e5bb-7cb2-26c4-98747917f305.png)

# 最後に

どちらの方法も一次配布元ではないのでいつまで追従するのか不安があります。
また、Unofficial Unity Package Manager Registryのパッケージはそれに加えて一旦ダウンロードしないと内容が分からないので差分が分からないのと誰がアップロードしたのか分からない不安さがあります。
この辺りを踏まえて便利に利用しましょう。