0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VCCにVPMリポジトリを追加してもパッケージが表示されない・追加できない原因と解決の備忘録

0
Posted at

症状

  • 自作のVPMリスティングをGitHub Pagesで公開し、VCC に追加した
  • リスティング自体は追加できるが、パッケージの一覧に何も表示されない
  • そのためプロジェクトにパッケージを追加できない
  • 当時はリスティングのサイト自体正しく表示できていなかった。

image.png
↑正しい表示の例

構成

  • リスティング本体: 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ツールの便利さとコードを読む力の必要性を感じた。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?