Package Managerに自作パッケージを追加する2019年版
2018年末にPackage Managerに自作パッケージを追加するという記事を書いたのですが、およそ一年ぶりにまた調べたのでどのような変化があったのか最新の情報をまとめてみようと思います。
要約
・GUI上でgitリポジトリからインストールができるようになった(2019.3)
・待望のドキュメント公開!
・gitリポジトリでのパッケージ間依存解決はサポートしなそうな方向
GUI上でgitリポジトリからインストール
自作パッケージをgitリポジトリからインストールする際、以前はmanifest.jsonを直接編集するしかなかったのですがUnity2019.3からついにPakcageManagerUIからできるようになりました。
おそらくmanifest.jsonと同じなので
・URLの最後に.gitが必要
・[#revision]の書式でブランチや特定コミットの指定も可能
だと思います。
https://docs.unity3d.com/Manual/upm-git.html
待望のドキュメント公開!
すべての答えがここにある!
前回の記事で書いた「こうではないか?」という内容の答え合わせができました。
「Assembly Define Filesの追加」は正解!
https://docs.unity3d.com/Manual/cus-asmdef.html
「自作パッケージ開発時のフォルダ構成」ほぼ正解!
記事で書いた「ローカルパッケージとして開発する」方法のほかに「プロジェクト内のPackagesフォルダで直接開発する」方法の2通りがあるようです。
https://docs.unity3d.com/Manual/CustomPackages.html
パッケージ内のフォルダ構成
パッケージ内のフォルダ構成についても「Unityオフィシャルなやつはこうしてるよ」というドキュメントが出ています。
不要な部分は消すなどしつつ基本的にはこれに則っておけばよさそうです。
一部のファイルはPackageManagerUIが勝手に見にいってUI上に反映してくれます。
クリックしても何も起こらない場合はOS側で.mdファイルを関連付けしとくと開けます。ソースを見ると最終的にApplication.OpenURL()が呼ばれるっぽいです。
Githubでリポジトリ作成時に作れるLICENSEファイルは.mdがついてないので拡張子をつける必要があります。
「Documentations~」?
Documentation~フォルダに"~"がついているのか気になった方もいるかもしれません。Unityには特定のファイルやフォルダをインポートから無視する機能があります。ProjectViewにも出てこなくなります。
https://docs.unity3d.com/Manual/SpecialFolders.html
最後が"~"のフォルダもこの対象なので、「ドキュメントとしてパッケージと一緒に配布するけどコンパイルや.metaを作る対象からは外す」という意図で"~"付きになっていると思われます。
結構スクリプトからいじれそう
意外なことにパッケージマネージャーの機能はわりとC#側で公開されています。
大きい会社などでやりそうな独自のパイプライン構築やCIするときなどに使えるかもしれません。
パッケージ間の依存関係解決
PackageManagerリリース当初はgit間でもパッケージが依存している別パッケージを自動的にインストールするような依存関係解決ができるようになると思っていたのですが、どうもそうではないようです。
Scoped Registoryと呼ばれるnpmサーバーが必要とのことで逆に言えばサーバーを用意すればUnityオフィシャルパッケージと同じことができるようです。ドキュメントではVerdaccioが紹介されています。
その名の通り社内限定パッケージのようなスコープを制限して管理したいケースではばっちりなのですがオープンソースなパッケージを依存解決したいだけな場合ちょっと困ります。どこかにみんながパッケージを突っ込むオープンなnpmサーバーがあればいいのですが現状ではまだ決定打はなさそうです。
しかしいくつか可能性のある候補が出てきつつあります。
OpenUPM
さいきょうのオープンなScoped Registoryとして正攻法で挑んでいる(と思われる)ところです。Githubをウォッチして更新があったら自動的にパッケージで公開したり、サブフォルダのpackage.jsonに対応していたり、と単なるnpmサーバーを超えたうれしい機能があります。
デメリットとしては個人開発っぽいので、流行って肥大化しても大丈夫?とか、ある日突然なくなるとか、将来的な安定性に不安があります。
npmjs.com
「オープンなnpmサーバー?npmjs.comがあるじゃないか」
まさかの本家に乗り込むスタイルです。
keijiroさんがやってて知ったのですが動作するようです。
一応フォーラムで上がってて、
Unity「動くけどnpmjsのポリシーに反してそうだから自己責任でやってね」
ユーザー「npmjsに聞いたけどいいって」
という感じみたいです。
メリットはとにかく安定してそう。デメリットはほんとにオッケーなのか伝聞なので確実じゃない、といったところでしょうか。
GitDependencyResolverForUnity
Scoped Registoryではないですがgitの依存解決をしてくれるパッケージです。同じくmob-sakaiさん作のUpmGitExtensionと合わせて使うことで当初思い描いていた理想のパッケージマネージャが完成します。
正直これがUnityオフィシャルになって標準で入ってくれればすべて解決な気もします。
Github Packagesは未対応
サーバー立てるのはハードル高いなと思ってたところちょうどGithub Packagesが公開されました。npmも対応しているしこれでは!と思っていたのですが残念ながら非対応なようです。
Supporting Github registries is not something we have in our short-term or mid-term plans. Sorry!
*Github Packagesはベータ期間中はGithub Package Registryという名前だったためフォーラムではそのように呼ばれています。
しかし多くの要望があるようでUnity側かGithub側どちらかが対応してくれる未来もありそうです。
More and more users like are asking for Unity to support this registry. I think we will get there.
その他
package.jsonがInspectorで開けるようになった
編集しやすくなってます。いいですね。
裏技?Sample~フォルダ
自作パッケージにサンプルシーンを入れているケースも多いかと思いますがgit経由のパッケージはエディタ上からシーンを開けません。
そこでパッケージ内のサンプルシーンをAssets下にコピーして開く必要があるのですが、その手間を減らすためにPakcageManagerUIに次のような機能が用意されています。
Samples~フォルダを掘ってpacakge.json内の"samples"という項目で指定するとPackgeManagerUIに表示されます
しかしこれはエディタがパッケージのサンプルにきっちり対応するまでの暫定対処らしくあまりおすすめしません(そのためかドキュメントにも記載されていません)。
というのもSample~フォルダは前述のとおり"~"付きでProjectView表示されないのでパッケージ開発時に困ります。Unity内部では開発時はSampleフォルダでデプロイ時にCIで"~"が付くパイプラインにしているようです。
詳細は次のフォーラムで追うことができます。
https://forum.unity.com/threads/samples-in-packages-manual-setup.623080/
まとめ
PackageManagerについて昨年からの差分的な感じで調べてみました。
基本的な機能は発展しつつも、自作パッケージ向けというよりUnityオフィシャルパッケージの配布ツールとしてまずは完成させるといった方向性が感じられました。
落ち着いてきたら自作パッケージ勢にもお得意の民主化パンチで良い意味でノックダウンをお見舞いしてくれるといいなと期待しています。
もしお役に立ちましたらスキ(♡マーク)をお願いします!!! noteアカウントがなくても大丈夫です。サポートもお待ちしています!