症状
- 自作のVPMリスティングをGitHub Pagesで公開し、VCC に追加した
- リスティング自体は追加できるが、パッケージの一覧に何も表示されない
- そのためプロジェクトにパッケージを追加できない
- 当時はリスティングのサイト自体正しく表示できていなかった。
構成
- リスティング本体:
vpm-repository(vrchat-community/template-package-listing )-
source.jsonのgithubReposに、パッケージ本体のリポジトリを指定 - GitHub Actions が
githubReposの各リポジトリの Releases を巡回し、index.jsonを自動生成 → GitHub Pages で公開
-
- パッケージ本体
- タグ (
v0.1.0等) を push すると GitHub Actions が package.json の内容をもとに zip を作成し、Release としてアップロード
- タグ (
調査
まず vpm-repository 側の GitHub Actions を見ると、ビルド自体は成功しているのに生成された index.json の packages が空だった。
{
"name": "gaussian's VPM Listing",
...
"packages": {}
}
ビルドログを詳しく見ると、「zip の中にマニフェスト (package.json) が見つからない」とのこと。しかし実際 zip の中には package.json は入っていた。
package-list-action のソースを確認すると、原因が判明した。
const string PackageManifestFilename = "package.json";
...
static byte[] GetFileFromZip(byte[] bytes, string fileName)
{
byte[] ret = null;
var stream = new MemoryStream(bytes);
ZipFile zf = new ZipFile(stream);
ZipEntry ze = zf.GetEntry(fileName); // ← "package.json" と完全一致でしか探さない
...
}
ZipFile.GetEntry("package.json") は zip のルート直下にあるエントリ名との完全一致でしか探索しない。つまり VPM のツール群は「zip を展開したら package.json がその直下に来る」という前提を持っている。
一方、ツール 側の Release ワークフローは以下のように zip を作っていた。
# .github/workflows/release.yml (修正前)
- name: Build package zip
run: |
zip_name="${{ env.PACKAGE_ID }}-${{ steps.package.outputs.version }}.zip"
(cd Packages && zip -r "../${zip_name}" "${{ env.PACKAGE_ID }}")
これだと zip の中身は
dev.avatarvcs.avatar-vcs/
├─ package.json
├─ Editor/
├─ Runtime/
└─ Tests/
のように、パッケージ名のフォルダが1階層余計にかぶさった状態になる。package.json はルート直下ではなく ツールリポジトリ/package.json にあるため、GetEntry("package.json") がヒットせず null が返り、Could not find manifest としてスキップされていた。
原因
VPMパッケージの Release zip は、zipを展開した直下に package.json が来る構造にしなければならない。
✕ dev.avatarvcs.avatar-vcs/package.json (フォルダを1つzipしていた)
○ package.json (フォルダの「中身」をzipする必要がある)
cd Packages && zip -r out.zip PackageFolder のようにフォルダごとzipすると前者になってしまう。フォルダの中にcdしてから.をzipする必要がある。
解決策
1. Release ワークフローの zip 生成コマンドを修正
PACKAGE_DIR (= Packages/dev.avatarvcs.avatar-vcs) の中に cd してから、その場で . (カレントディレクトリの中身全部) を zip する。こうすると package.json が zip のルート直下に来る。
2. リスティングを再ビルド
vpm-repository 側の GitHub Actions を再実行し、index.json にパッケージが載ることを確認。
VCC側はリスティングをキャッシュすることがあるので、反映されない場合はリスティングを一度削除して再追加、またはVCCを再起動する。
最後に
Pre-Release Packagesやパッケージにチェックを入れるなどのVCC側の操作も忘れないようにする必要がある。
AIツールの便利さとコードを読む力の必要性を感じた。
