もんりぃ is undefined.

育児ネタとか、技術ネタとか。

Unity 2019.1 で Unity Package Manager が 90% くらい民主化された件について

はじめに

日本時間の 2019/04/16 (Tue) に Unity 2019.1 がリリースされました。

で、リリースノートの中に Unity Package Manager に関して気になる記述を見つけたので、検証してみたところかなり嬉しい結果になったので、それの報告となります。

  • 2019/04/18 (Thu) 03:50 追記

Unity Package Manager (upm) とは?

ググれ

docs.unity3d.com

ざっくり言えば、Unity が提供する新しいパッケージ管理のための仕組みです。

これを用いれば Unity の UI 上で Unity 公式のパッケージを追加・更新できるようになります。

民主化

実は以前、以下の記事でも upm の民主化について触れています。

monry.hatenablog.com

この時点では、サードパーティのパッケージに依存するサードパーティのパッケージを追加出来ず「時期尚早」との結論を出していました。

しかし、今回改めて調べ直してみると、(どこのバージョンからかは分かりませんが) 自前の npm Registry を立てれば行ける ことが分かりました!

f:id:monry84:20190417015031p:plain
実際に試してみた結果

どうやるの?

ポイントは 自前の npm Registry を立てる という点にあります。

そもそも npm Registry というのは、 Node.js のモジュールである npm パッケージをホスティングするサービス のコトを指しており、 https://www.npmjs.com/ が親玉的な存在になっています。

んで、まぁ、npmjs に対してパッケージを Publish すれば npm は勿論、upm からもダウンロードが出来る *1 ようになるわけです。 が、 npmjs は本来 JavaScript のモジュールをホスティングするためのサービスであり、基本的に Unity Package Manager がアクセスする場所としては想定されていません。

「じゃあ、どうすりゃいいのよ?」というと 自前で npmjs クローンを作る という話になるわけです。

で、もちろん相当頑張れば npmjs クローンをイチから作るコトも出来るとは思いますが、そこは便利な時代になったもので Verdaccio という OSS がその役割を担ってくれるのです。

いや、だから、どうやるの?

はい。本題です。

Verdaccio のインストール・起動

公式のドキュメントにやり方は書いてありますが、私は Docker を用いました。

docker pull verdaccio/verdaccio
docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio

はい、おしまい。

これで立ち上がるプロセスが 4873 ポートで張ってくれているので http://localhost:4873 にアクセスして以下のような画面が表示されれば起動成功です。

f:id:monry84:20190417020212p:plain

Verdaccio のユーザ追加と設定

画面に書かれている

npm adduser --registry  http://localhost:4873

を打ち込むと、 * ユーザ名 * パスワード * メールアドレス の入力を求められるので、入力します。

これにより、前節で立ち上げた Verdaccio のコンテナにユーザの登録が行われて、ホスト OS 側にも認証情報が記録された形になります。

Verdaccio へのパッケージの追加・更新

パッケージとして追加したいディレクトリに例えば以下のような JSON ファイルを package.json という名前で配置します。*2

{
  "name": "dev.monry.upm.test",
  "dependencies": {
  },
  "version": "1.0.4",
  "unity": "2019.1",
  "displayName": "Monry Test",
  "description": "",
  "keywords": [
    "unity"
  ],
  "readme": "test test test"
}

そして、 package.json が配置されているディレクトリで以下のコマンドを実行します。

npm publish --registry=http://localhost:4873

するとログが少し出て、登録が完了した旨が表示されます。

f:id:monry84:20190417021851p:plain

依存パッケージの追加・設定

元々やりたかったコトとして、「サードパーティパッケージがサードパーティパッケージに依存する」という状況を作りたかったので、依存先となるパッケージも登録します。

例えば以下のような package.json のパッケージを追加します。

{
  "name": "dev.monry.upm.dependent",
  "dependencies": {
  },    
  "version": "1.1.0",
  "unity": "2019.1",
  "displayName": "Monry Dependent",
  "description": "",
  "keywords": [
    "unity"
  ],
  "readme": "dependent!"
}

これを npm publish --registry=http://localhost:4873

で、これを参照するために、元々作っていた dev.monry.upm.test というパッケージの package.json を以下のように変更します。

  {
    "name": "dev.monry.upm.test",
    "dependencies": {
+     "dev.monry.upm.dependent": "1.0.1"
    },
-   "version": "1.0.3",
+   "version": "1.0.4",
    "unity": "2019.3",
    "displayName": "Monry Test",
    "description": "",
    "keywords": [
      "unity"
    ],
    "readme": "test test test"
  }

こっちも新しいバージョンである v1.0.4 を Verdaccio に登録するために npm publish --registry=http://localhost:4873

これで準備完了です。

Unity Package Manager に Registry を追加

標準の Unity Package Manager では、Unity 公式の Registry しか参照できません。 そこで、今回作成したオレオレ Registry を Unity Package Manager に認識させる必要があります。

やり方としては、オレオレ Registry のパッケージを利用したい Unity プロジェクトの Packages/manifest.jsonscopedRegistries ノードを追加するだけです。

{
  "scopedRegistries": [
    {
      "name": "monry.dev",
      "url": "http://localhost:4873",
      "scopes": [
        "dev.monry"
      ]
    }
  ],
  "dependencies": {
    "com.unity.ads": "2.0.8",
    …中略
    "com.unity.modules.xr": "1.0.0"
  }
}

各ノードの意味はザックリと以下のような感じです。

  • name: 何でも良いが、分かりやすいものがヨサソウ
  • url: Registry の URL
  • scopes: 逆ドメイン記法のパッケージ名プレフィックスを指定
    • 複数指定可能
    • 詳細度順に最も先にマッチしたモノが採用される

詳しいコトはマニュアルをご参照ください。

パッケージをプロジェクトにインストール

ここまでの手順で、Unity Package Manager の UI 上に Verdaccio に登録したパッケージが表示されるようになっています。

f:id:monry84:20190417023213p:plain

あとはインストールしたいパッケージを選択して Install ボタンを押下すれば依存パッケージも含めてプロジェクトへのインストールが完了します!

f:id:monry84:20190417023437p:plain

OSS 的な公開

今回の手順だと、完全に localhost で閉じた話になってしまっています。 しかし、例えば AWS などのパブリッククラウド上にインスタンス立てて Verdaccio をインストールして適切にネットワークなどの設定を施せば外部からアクセス可能な Registry として利用することができます。 今回はその辺のアーキテクチャとかについては言及しませんが、インフラにたしなみがある人であればそんなに難しくないんじゃないかと思います。

追記: 実際にやってみた

upm-registry.dev

Verdaccio を GCP 上に立ててみました。 あくまで実験用ですが、需要が高ければ本気で運用考えます。

f:id:monry84:20190418040711p:plain

なお、認証関連の仕組みとして 特定の GitHub Organizations の Member 以外は、ダウンロードはできるけど publish ができないようになっています。

原因は定かではありませんが、パッケージ一覧の取得に失敗するコトがあるようで、 Packages/manifest.json に個別にパッケージを記載しないと駄目かも?

まとめ

  • Verdaccio を立ててパッケージを登録する
  • Packages/manifest.jsonscopedRegistries を追加すればオレオレパッケージが管理可能
  • 頑張れば一般配布用に公開もできる

………90%?

ところで、この記事のタイトルは「Unity Package Manager が90%くらい民主化された件について」です。

まぁ、100%って言っちゃっても良かったんですが、 Unity さんがサードパーティのパッケージを登録するための Registry を解放 してくれて初めて 真の民主化 と言えるかな、というコトで辛口の採点にしていますw

Asset Store の Asset なんかも upm に統合していくという噂もあるので、今後の展開も楽しみですね!

*1:ちょっと設定必要ですが

*2:バージョン名とか名前はテキトーです。