はじめに
この記事は Unityゆるふわサマーアドベントカレンダー2019 の 29 日目の記事です。
前日の記事は @tan-y さんの (もうちょっと) 楽に Unity ネイティブプラグイン を実装したい という記事でした。
前置き
相変わらず「Unity Package Manager 大好きオジサン」として、日々 Unity Package Manager と戯れています。
んで、少し前に(毎回 JSON を手で弄るのメンドイな…。)(ってか Scoped Registry の追加とか GUI 側で対応してくれる気配が当分無さそうだな…。)とか思い、「無ければ作ればええんや!」と思い至って開発してみた次第です。
作ったもの
タイトルにあるとおり、 Unity Package Manager をコマンドラインから操作する ための CLI ライブラリを作りました。
動作環境
- Unity 2019.2
- bash (GitBash なども可)
- Dependencies
git
jq
- https://stedolan.github.io/jq/
- JSON を加工するための CLI
gsed
事前準備
依存するツールをインストール
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 package
や upm 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 向けのパッケージ用の雛形プロジェクトを作成します。
引数を指定しなかった場合、対話型でパッケージ名などを入力します。
ここで指定する 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
の内容を元にしてレジストリの一覧が表示されるので、番号を指定して選択します。
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
のみに記載されます。
引数を指定しなかった場合、対話型でパッケージ名を指定します。
バージョン番号はパッケージのスコープが含まれるレジストリに問い合わせて自動的に最新版のバージョン番号が採択されます。
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という勉強会の紹介とふりかえり」です。