もんりぃ is undefined.

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

Unity Package Manager をコマンドラインから操作するための upm コマンドを作ってみました

はじめに

この記事は Unityゆるふわサマーアドベントカレンダー2019 の 29 日目の記事です。

前日の記事は @tan-y さんの (もうちょっと) 楽に Unity ネイティブプラグイン を実装したい という記事でした。

前置き

相変わらず「Unity Package Manager 大好きオジサン」として、日々 Unity Package Manager と戯れています。

んで、少し前に(毎回 JSON を手で弄るのメンドイな…。)(ってか Scoped Registry の追加とか GUI 側で対応してくれる気配が当分無さそうだな…。)とか思い、「無ければ作ればええんや!」と思い至って開発してみた次第です。

作ったもの

github.com *1

タイトルにあるとおり、 Unity Package Manager をコマンドラインから操作する ための CLI ライブラリを作りました。

動作環境

事前準備

依存するツールをインストール

brew install git jq gnu-sed

upm コマンドをインストール

bash <(curl -sL https://raw.githubusercontent.com/upm-packages/upm-cli/master/scripts/install-latest-release.sh)

~/.upm/ 以下にバージョン毎のディレクトリが作成され、その中にシェルスクリプトがインストールされます。

さらに、brew 的に PATH が通っているであろう /usr/local/bin/upm という名前で SymLink が作られます。*2

設定ファイルを作成

以下のような設定ファイルを ~/.upm-config.json として保存します。

{
  "registries": {
    "upm-packages.dev": {
      "name": "Unofficial Unity Package Manager Registry",
      "protocol": "https",
      "hostname": "upm-packages.dev",
      "scopes": [
        "com.stevevermeulen",
        "jp.cysharp",
        "dev.monry",
        "dev.upm-packages"
      ],
      "unity_version": "2019.2",
      "author": {
        "name": "Tetsuya Mori",
        "url": "https://me.monry.dev/",
        "email": "monry84@gmail.com"
      },
      "license": {
        "type": "MIT",
        "url": "https://monry.mit-license.org/license.txt"
      },
      "repository": {
        "type": "git",
        "user": "monry",
        "organization": ""
      },
      "domain": "dev.monry"
    }
  }
}

この設定ファイルは、 upm add registry, upm add packageupm init などのコマンドが参照するデフォルト設定的なモノであり、 upm コマンドの根幹を成すファイルとなっています。

Key Type Description
registries Object レジストリ名: レジストリ情報
 <registry_name> Object レジストリ情報
  name String レジストリ
  protocol String レジストリプロトコル
  hostname String レジストリのホスト名
  scopes Array レジストリが取り扱うパッケージのスコープ
  unity_version String パッケージ作成時のデフォルト Unity バージョン
  author Object パッケージ作成時のデフォルト作者情報
   name String 作者名
   url String 作者のウェブサイト
   email String 作者のメールアドレス
  license Object パッケージ作成時のデフォルトライセンス情報
   type String ライセンス種別
MIT, Apache などの SPDX Licenses から選択
   url String ライセンス URL
パッケージ作成時にダウンロードし LICENSE.txt として配置
  repository Object パッケージ作成時のデフォルトリポジトリ情報
   type String リポジトリ種別
git, mercurial など *3
   user String リポジトリのユーザ名
monry など
   organization String リポジトリの組織名
kidsstar など
  domain String パッケージ作成時のデフォルトスコープドメイン
dev.monry など

upm コマンドの使い方

コマンドの一覧は以下の通りです。

  • help
  • init
  • add registry
  • add package
  • remove package

help

upm help

upm help add registry

まぁ、ヘルプです。使い方を表示します。

サブコマンドを入れるコトで詳細を表示可能です。

各コマンドの引数として -h--help を付けるコトで同様のヘルプを表示可能です。

init

upm init upm-packages.dev "upm.sample" "Sample Package" "何か説明"

Unity Package Manager 向けのパッケージ用の雛形プロジェクトを作成します。

引数を指定しなかった場合、対話型でパッケージ名などを入力します。

f:id:monry84:20190829134205p:plain

ここで指定する project_name は、パッケージ ID を dev.monry.upm.sample としたい場合は設定ファイルに定義済の domain を含まない upm.sample を指定します。

実行時のディレクトリ直下に Unity プロジェクトが作成されます。

add registry

upm add registry upm-packages.dev

作成済みの Unity プロジェクトの Packages/manifest.json に対して、Scoped Registry の情報を追記します。

引数を指定しなかった場合、対話型でレジストリを指定します。
~/.upm-config.json の内容を元にしてレジストリの一覧が表示されるので、番号を指定して選択します。

f:id:monry84:20190829134053p:plain

Unity プロジェクトのルートディレクトリ (( Assets/ProjectSettings/ があるディレクトリ)) で実行する必要があります。

add package

upm add package dev.monry.upm.foo.bar 1.0.1

作成済みの Unity プロジェクトの Packages/manifest.json と、 Assets/package.json に対して依存パッケージの情報を追記します。
Assets/package.json が存在しない場合は、 Packages/manifest.json のみに記載されます。

引数を指定しなかった場合、対話型でパッケージ名を指定します。
バージョン番号はパッケージのスコープが含まれるレジストリに問い合わせて自動的に最新版のバージョン番号が採択されます。

f:id:monry84:20190829134431p:plain

Unity プロジェクトのルートディレクトリで実行する必要があります。

remove package

upm remove package dev.monry.upm.foo.bar

Unity プロジェクトの Packages/manifest.json と、 Assets/package.json から依存パッケージの情報を削除します。
Assets/package.json が存在しない場合は、 Packages/manifest.json のみから削除されます。

今後

公式が民主化してくれることを期待しつつ、機能の拡充を図るつもりです。

パッケージのアップグレードなどが未対応なので、その辺は早急に対応したいなぁ…。

所感

upm コマンドを作るにあたって、人生で初めて真剣に Bash スクリプトと向き合いました。

Bash スクリプトでも自動テストができる *4 のに感動しつつ、四苦八苦しながらの開発はとても楽しかったです。

お陰で Bash に対する苦手意識というかアレルギー的なモノが少し解消された気がしており、ちょっとした社内向けのシェルスクリプトとかを気軽に書けるようになりました。

新しい技術にトライする時は腰が重くなりがちですが、いざ乗り越えてみると世界が広がるので、何事も挑戦してみるものだなぁ…と思った次第です。

おわりに

ということで、 Unityゆるふわサマーアドベントカレンダー2019 29日目の記事は「Unity Package Manager をコマンドラインから操作するための upm コマンドを作ってみました」でした。

30日目は @lycoris102 さんの「🥞Unity Designer's Cafeという勉強会の紹介とふりかえり」です。

*1:この記事に書いてあるコトは、リポジトリの README に書いてあります。

*2:この辺、オーソドックスな方法が分からなかったので、識者の方からのご意見お待ちしております。

*3:本来 GitHub として指定すべきだが、現在のバージョンでは未サポート

*4:当たり前っちゃ当たり前ですが