3
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Google Cloud Artifact RegistryでUnity Package Managerのプライベートレジストリを作成する

「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のリポジトリを作成します。

スクリーンショット 2020-11-29 23.52.16.png

リポジトリの名前は「advent-calendar」とします。

スクリーンショット 2020-11-28 16.44.22.png

リポジトリ「advent-calendar」が作成されました。

スクリーンショット 2020-11-30 0.13.43.png

advent-calendarをクリックして、リポジトリの中身を確認してみます。作成直後なのでパッケージは1つもありません。とりあえずリポジトリは作成完了です。

スクリーンショット 2020-11-28 16.49.03.png

リポジトリにログインする

リポジトリにパッケージを追加すること、またUnityでそのパッケージを取得するには、リポジトリにログインする必要があります。以下が一連の手順です。

  1. gcloudコマンドの初期化でGoogleアカウント認証
  2. .npmrcにリポジトリ設定を追加
  3. npxコマンドでnpmリポジトリにログイン(npm publishでパッケージの追加ができるようになる)
  4. 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」を作成します。設定例です。

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を作成します。作成例。

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から取得するようになります。

Packages/manifest.json
{
  "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)

スクリーンショット 2020-11-29 21.47.35.png

リポジトリにアクセスするユーザーの管理

IAMでリポジトリにアクセスするユーザーを管理できます。任意のGoogleアカウントを、ロールを選択して追加するだけです。

スクリーンショット 2020-11-30 0.35.28.png

おわりに

verdaccioを使い、グローバルIPでアクセス制限を設けてプライベートレジストリを構築することを検討していたのですが、Artifact Registryの登場により選択肢が増えました。IAMでユーザーの権限管理できるのも良いです。
しばらくはArtifact Registryで運用して、使い勝手を把握しようと思います。

※参考にさせて頂いた記事
https://monry.hatenablog.com/entry/2020/03/07/015041

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
3
Help us understand the problem. What are the problem?