「Google Cloud + Gaming Advent Calendar 2020」の4日目を担当させていただくことになりました、株式会社グレンジの村田です。
Artifact Registry
Google CloudのArtifact Registryは、11月17日(現地時間)に一般提供を開始した新しいサービスです。Google Container Registryの進化形でもあり、コンテナイメージだけでなく言語パッケージなども管理できます。
Artifact Registryはnpmをサポートしてます。UnityのPackage Managerはnpmをベースにして動作しており、社内でUnity Package Managerのプライベートレジストリのニーズがあったため、Artifact Registryのnpmが利用できないか試しました。結果、設定方法を少し注意すれば使えることがわかったので、本記事ではUnityから利用するための手順を説明しています。
※執筆時点ではnpmがアルファ版のため、アンケートに答えて申請しないと使えません。申請してから約5日間ほどで使えるようになりました。
npmリポジトリの作成(npmレジストリ)
まずはnpmのリポジトリを作成します。
リポジトリの名前は「advent-calendar」とします。
リポジトリ「advent-calendar」が作成されました。
advent-calendarをクリックして、リポジトリの中身を確認してみます。作成直後なのでパッケージは1つもありません。とりあえずリポジトリは作成完了です。
リポジトリにログインする
リポジトリにパッケージを追加すること、またUnityでそのパッケージを取得するには、リポジトリにログインする必要があります。以下が一連の手順です。
- gcloudコマンドの初期化でGoogleアカウント認証
- .npmrcにリポジトリ設定を追加
- npxコマンドでnpmリポジトリにログイン(npm publishでパッケージの追加ができるようになる)
- Unityの設定ファイルにトークンをセット(Unityからパッケージを取得できるようになる)
Artifact Registryのコンソールの「設定の手順」にnpxコマンドまでの手順は書いてありますが、「npmの構成」にある「_password」だと、Unityの設定ファイルに記載するトークンが取れないので、少し変更を加えて.npmrcに設定する必要があります(後述)。
gcloud の初期化
「Google Cloud SDK のインストール」に従い、gcloud initを実行してください。
https://cloud.google.com/sdk/docs/install?hl=JA#top_of_page
続いて、次のコマンドでも認証しておきます。
gcloud auth application-default login
.npmrcにリポジトリ設定を追加
.npmrcはどのディレクトリで作成しても構いません。本記事ではホームディレクトリとします。すでに.npmrcが存在していれば、追記します。
先述の「npmの構成」を参考にしつつ、次の3行のような構成にしてください。
@adventcalendar:registry=https://asia-northeast1-npm.pkg.dev/YOUR-PROJECT-NAME/advent-calendar/
//asia-northeast1-npm.pkg.dev/YOUR-PROJECT-NAME/advent-calendar/:_authToken=""
//asia-northeast1-npm.pkg.dev/YOUR-PROJECT-NAME/advent-calendar/:always-auth=true
「_password」は「_authToken」に変更しており、「username」と「email」の行は削除しています。「@SCOPE」は「@adventcalendar」にしました。
「asia-northeast1-npm」や「YOUR-PROJECT-NAME」は指定したリージョンやお使いのGCPプロジェクト名で変わります。
※この3行の形式はコンソールに表示される「npmの構成」とは別に、次のドキュメントに記載がありました
https://cloud.google.com/artifact-registry/docs/nodejs/quickstart#config
npxコマンドでリポジトリにログインする
ホームディレクトリに.npmrcがある場合、次のコマンドを実行します。
npx google-artifactregistry-auth ~/.npmrc
これでnpm publishでパッケージ登録ができる状態になります。
その後、.npmrcファイルを確認すると、_authTokenに値がセットされているはずです(YOUR_TOKENの部分)。この値をメモしておいてください。
@adventcalendar:registry=https://asia-northeast1-npm.pkg.dev/YOUR-PROJECT-NAME/advent-calendar/
//asia-northeast1-npm.pkg.dev/YOUR-PROJECT-NAME/advent-calendar/:_authToken="YOUR_TOKEN"
//asia-northeast1-npm.pkg.dev/YOUR-PROJECT-NAME/advent-calendar/:always-auth=true
※この「_authToken」が必要なため、先ほどの手順で「_password」から「_authToken」に変更しました。
Unityの設定ファイル.upmconfig.tomlを作成
ホームディレクトリにUnityの設定ファイル「.upmconfig.toml」を作成します。設定例です。
[npmAuth."https://asia-northeast1-npm.pkg.dev/YOUR-PROJECT-NAME/advent-calendar/"]
token = "YOUR_TOKEN"
email = "not.valid@email.com"
npmAuthの後ろは.npmrcのregistryのURLです。YOUR_TOKENは先ほどメモした値をセットしてください。emailはnot.valid@email.comで良いです。これでUnityからもリポジトリにアクセスできるようになりました。
※.upmconfig.tomlについて
https://docs.unity3d.com/Manual/upm-config.html
https://docs.unity3d.com/Manual/upm-config-scoped.html
リポジトリにパッケージを追加する
パッケージとして登録するUnityプロジェクトに、package.jsonを作成します。作成例。
{
"name": "jp.grenge.sample",
"displayName": "Advent Calendar Sample",
"version": "1.0.0",
"unity": "2020.1",
"description": "AdventCalendar記事用のサンプルパッケージです。",
"author": {
"name": "Grenge"
}
}
ファイル構成例。
├── Runtime
│ ├── Prototype.Sample.asmdef
│ ├── Prototype.Sample.asmdef.meta
│ ├── Sample.cs
│ └── Sample.cs.meta
├── Runtime.meta
├── package.json
npm publishでリポジトリにパッケージを追加します。--registryオプションで明示的にリポジトリURLを指定します。
npm publish --registry https://asia-northeast1-npm.pkg.dev/YOUR-PROJECT-NAME/advent-calendar/
ハマった点ですが、パッケージ名を「@adventcalendar/sample」とすれば、npm publishのみで--registryオプション無しでも追加可能です。しかし、Unityでは「@adventcalendar」で始まるパッケージ名が、指定のリポジトリURLに変更するという動作が機能してくれませんでした。
今回はパッケージ名を「jp.grenge.sample」として、Unityにて「jp.grenge」で始まるパッケージ名が指定のリポジトリURLにアクセスされることを確認しています(後述)。パッケージ名がスラッシュ区切りか(@adventcalendar/sample)、ピリオド区切りか(jp.grenge.sample)でUnityの処理が異なっていそうです。
Unityからパッケージを取得する
Packages/manifest.jsonの「dependencies」に「jp.grenge.sample」を追加し、「scopedRegistries」にリポジトリの設定を追加します。「scopes」に「jp.grenge」を指定することにより、パッケージ名「jp.grenge」で始まるパッケージは指定したリポジトリURLから取得するようになります。
{
"dependencies": {
"com.unity.collab-proxy": "1.3.9",
(省略)
"jp.grenge.sample": "1.0.0"
},
"scopedRegistries": [
{
"name": "advent-calendar",
"url": "https://asia-northeast1-npm.pkg.dev/YOUR-PROJECT-NAME/advent-calendar/",
"scopes": [
"jp.grenge"
]
}
]
}
UnityのPackage Managerで確認。無事取得できました(Unity 2020.1.13f)
リポジトリにアクセスするユーザーの管理
IAMでリポジトリにアクセスするユーザーを管理できます。任意のGoogleアカウントを、ロールを選択して追加するだけです。
おわりに
verdaccioを使い、グローバルIPでアクセス制限を設けてプライベートレジストリを構築することを検討していたのですが、Artifact Registryの登場により選択肢が増えました。IAMでユーザーの権限管理できるのも良いです。
しばらくはArtifact Registryで運用して、使い勝手を把握しようと思います。
※参考にさせて頂いた記事
https://monry.hatenablog.com/entry/2020/03/07/015041