ゼニガネブログ

ゲーム開発のための小ネタなど。現在はUnityメインでやってます

OpenUPMのパッケージ検索をUnityエディタだけで完結出来ないか考えた話

考えた話なので具体的なソースコードや成果物はこの記事には存在しませんので、あしからずご了承下さい。
※ ↓成果物が出来たので公開しました
zenigane138.hateblo.jp

はじめに

OpenUPM のパッケージ検索方法は2023年4月時点では主に下記の2通りだと思います。
- OpenUPM サイト上で行う
- Node.js と openupm-cli をインストールしコマンドラインから行う

新規に何か探す時は OpenUPM のサイトを見れば良いと思うですが、個人的にはインポートしたい物が決まっている時は Unity エディタだけで完結して欲しかったので方法を考えてみました。

すぐに思いついた方法はこの2通りです。
- openupm-cli で検索に使用している物を調べてUnityでも使用するパターン
- GitHub API を使用するパターン

今はやりたい事が大渋滞を起こしていて、0から調べる時間を作るのはちょっと勿体ないので後者のGitHub APIパターンで考えてみる事にしました。
しかしある程度まで進めた所、面倒な準備不要で特に制限もなく誰でも簡単に使えるOSS化までは至りませんでした。
…という流れだったのですが、記事を書きながら検証を進めている途中でこれならギリギリ公開しても良いかな?というラインに近づいたので後日公開するかもしれません。

流れ

Package Manager部分は自作せずに、Unityの機能にそのまま乗っかる事にします。
なので今回はエディタ拡張ウィンドウから ProjectSettings の Package Manager の項目にパッケージの name (com.okanegames.anythingbookmark) を登録するのがゴールです。
最終的なインポートは Package Manager を開く必要があるのでエディタ拡張ウィンドウに開くボタンを用意してあげると親切です。

ざっくり
- エディタ拡張ウィンドウで検索用の文字列を入力
- 検索処理
- 今回全く触れませんが openupm-cli でも GitHub API でもここが違うだけで他は基本的に同じです
- 検索結果を元にパッケージの name を ProjectSettingsのPackage ManagerのScope(s)に追加or新規登録(Name/URLは固定値)
- Package Managerからインストール

GitHub API (Repository contents API) を使用するパターン

概要
- Repository contents API を使って /data/packages にある全ymlファイルを取得してキャッシュ
- https://docs.github.com/en/rest/repos/contents?apiVersion=2022-11-28#get-repository-content
- キャッシュから検索

主な問題点
- パッケージの name (com.okanegames.anythingbookmark) でしか検索ができない
- あまりいないと思うけどリポジトリ名と全然別物が設定されていてリポジトリ名だけが有名だと困る
- ディレクトリ構成が変更されたら使えなくなる
- 2023年4月時点で2800ファイル近い
- このAPIでのファイル一覧取得は最大1000件までなのでページネーションが必要 ※実は存在しないので注意
- 未認証でも使えるけどIP単位で【10回/m】【60回/h】のリクエスト制限
- 大企業が使うとは思いませんがページネーションと合わせると一瞬で使い切ってしまう
- 認証を通せば【30回/m】【5000回/h】いけるけどパーソナルアクセストークン(classic PAT)をGitHubで公開しちゃう問題
- IP単位60回/hではなくPATを持つアカウント単位5000回/hになるので84人以上同時に使うなら未認証の方が良い場合も(ほぼありえません
- 使用者にPATを登録してもらうようにすればいいけどお手軽さからは離れていく
- masterブランチのファイルを参照しているだけなのでOpenUPM側の準備が完全には完了していない可能性がある

試した所感
- 本当に恥ずかしい話なのですが、公式ドキュメントを読まず、適当にぐぐった情報を鵜呑みにしてper_pageとpage指定しているのにページネーション動かない…と20分程悩みました
- その後公式ドキュメントを読んだ結果、このAPIにはページネーション用のパラメータは存在せず、1000件制限があってそれ以上取得したい場合はGit Trees APIを使ってね!と書いてある事が判明しました
- というわけでGit Trees APIを使用するパターンでいきます

GitHub API (Git Trees API) を使用するパターン

概要
- Git Trees API を使って /data/packages にある全ymlファイルを取得してキャッシュ
- https://docs.github.com/en/rest/git/trees?apiVersion=2022-11-28#get-a-tree
- キャッシュから検索

主な問題点
- TreeSHAの取得が必要になる点以外はRepository contents APIとほぼ同じ
- 10万エントリまでしか取得できない
- 現状2800件近く登録されていますが、もし仮に毎年で3千件ずつ登録されていったとしても32年は保つので今回は気にしない事にします

試した所感
- これならギリギリ公開しても良いような気がしてきた

というわけで後日公開するかもしれません。