Repository navigation
パッケージマネージャを npm から pnpm へ移行する - #521
Conversation
開発規約は pnpm のみを使うことになっているが embed は npm のままだった。 あわせて、Node 22 同梱の npm 10 では vitest ^4.1.1 の peer 解決で arborist が 落ちてローカルで lock を再生成できない問題 (#519 で実際に踏んだ) からも外れる。 配布物は変わらない。公開済み 6.0.0-pre.4 の tarball と npm pack / pnpm pack を 突き合わせ、パス集合が一致することを確認している。 移行で判明したこと: - @types/geojson は phantom dependency だった。src/lib/parse-atts.ts が GeoJSON 名前空間を使っているが宣言が無く、npm では maps-core -> @turf/bbox 経由で hoist されたものを拾って偶然動いていた。pnpm の厳格なレイアウトでは TS2503 でビルドが落ちるため devDependencies へ明示した。maps-core が turf を 外せば npm でも壊れるので、移行の有無に関わらず直すべきものだった。 - pnpm 12 は .npmrc の ignore-scripts を読まない。設定が黙って無効になり esbuild のビルドスクリプトを無視したことが ERR_PNPM_IGNORED_BUILDS となって install が失敗する。pnpm-workspace.yaml へ移設し .npmrc は削除した。 esbuild は 0.25 以降プラットフォーム別パッケージを optionalDependencies で 解決するので、ビルドスクリプトを実行しなくても動作する。 - pnpm pack は npm と違い .gitignore / .npmignore をパッケージへ含めるので、 .npmignore に明示して公開物を一致させた。 publish も pnpm にした。pnpm 12 は OIDC trusted publishing に対応している (バイナリに /-/npm/v1/oidc/token/exchange/package/ と ACTIONS_ID_TOKEN_REQUEST_URL を確認)。現行の公開も trusted publishing なので これを維持する。npm は OIDC publish で provenance を自動付与するが pnpm は 明示が要るため --provenance を渡す。--no-git-checks は、publish ジョブが タグを checkout したうえにビルド成果物を作業ツリーへ展開するため pnpm 既定の git チェックに引っかかるのを避けるもの。npm install -g npm@latest は不要に なったので削除した。 pnpm/action-setup は setup-node より前に置く必要がある (cache: 'pnpm' が store path を引くため)。 検証はすべて green: pnpm install --frozen-lockfile / tsc --noEmit / lint / test 15 passed / build / playwright --workers=1 20 passed。 Refs #520
6.0.0-pre.4 の dist/embed-core.js は maplibre-gl v6 を同梱しながら、ライセンス 表記も dist/embed-core.js.LICENSE.txt も持たない状態で公開されていた (6.0.0-pre.3 までは出力されていた)。BSD-3-Clause の表示義務に関わるので直す。 原因は terser。maplibre のソース先頭の @license コメントは通常 extractComments が <bundle>.js.LICENSE.txt へ切り出すが、terser はコメント単体ではなく 「コメントが付いているコード」を基準に扱うため、そのコードが削除・並べ替え されるとコメントごと消え、extractComments まで届かない。minimize: false で ビルドすると未圧縮バンドルには banner が残っていることを確認した。 embed.js だけ残るのは偶然で、embed.ts が Object.assign(..., maplibregl, ...) で 名前空間を丸ごと使うため全体が生き残るからにすぎない。embed-core.ts は maps-core 経由の一部シンボルしか使わないため落ちる。pre.3 まで出ていたのも maplibre 5 系の構造でたまたま残っていただけで、明示していない以上いつ壊れても おかしくなかった。 BannerPlugin で明示する。バージョンは maplibre-gl/package.json から読むので 手で追従する必要はない。BannerPlugin は terser より前の段階で走るので banner は 通常どおり extractComments に拾われ、embed.js 側は terser が同一コメントを 重複排除するため二重にはならない (両方ビルドして確認済み)。 公開済み 6.0.0-pre.4 の tarball とのパス差分は dist/embed-core.js.LICENSE.txt が 1 件増えるだけで、他は変わらない。 Refs #520
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
⛔ Files ignored due to path filters (2)
📒 Files selected for processing (9)
💤 Files with no reviewable changes (1)
Included review availability: This review used your included allowance. 4 included reviews remain after this review. Your included PR review attempts over the past 7 days set your current allowance at 5 reviews per hour. 📝 WalkthroughWalkthroughCI、開発手順、公開処理のパッケージマネージャを npm から pnpm に切り替えます。pnpm の設定と依存関係を追加し、webpack のバンドルに MapLibre GL JS のライセンス表記を付与します。 Changespnpmへの移行
ライセンスバナー
Priority: ➖ Normal Change: Other · Severity of issue fixed: Medium Merge Risk: ⚪ Minimal · up to The pnpm migration and license-banner change appear mergeable after normal checks. The first tagged publish remains unverified. 🚥 Pre-merge checks | ✅ 3 | ❌ 1 | ❓ 1❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
Full details: Linked Issues checkExplanation [
Comment |
当初 @v4 を使っていたが、pnpm v12 対応は v6.1.0 (pnpm/action-setup#288) で 入ったものだった。packageManager には pnpm@12.9.1 を固定しているので v4 では 動かない。 あわせてサードパーティ製アクションなので commit SHA で固定する。zizmor を master と比較すると @v4 のままでは unpinned-uses が 17 -> 20 に増えていた。 SHA 固定で 17 に戻り、この PR による新規の指摘は無くなる (npm install -g npm@latest を削除したぶん adhoc-packages が 1 -> 0 に減る)。 既存の actions/* はタグ参照のままで、この PR では触っていない。 Refs #520
Closes #520
開発規約は pnpm のみを使うことになっているが、embed は npm のままでした。移行します。あわせて、移行検証の過程で見つけた maplibre-gl のライセンス表記が配布物から欠落している退行(#519 由来)も直しています。
コミットは 2 本に分けてあります。
9ad6ceechore:pnpm 移行d147cb8fix(build):embed-core.js のライセンス表記8c67324chore(ci):pnpm/action-setup を v6.1.0 / SHA 固定へ1. pnpm 移行
配布物は変わりません
公開済み 6.0.0-pre.4 の tarball と
npm pack/pnpm packを突き合わせ、パス集合が一致することを確認しています(下の 2. で増えるdist/embed-core.js.LICENSE.txtを除く)。移行で判明したこと
@types/geojsonが phantom dependency だった素の
pnpm installだとビルドが落ちます。src/lib/parse-atts.tsがGeoJSON名前空間を使っているのに宣言が無く、npm ではmaps-core → @turf/bbox → @types/geojsonが hoist されたものを拾って偶然動いていました。devDependencies へ明示しています。maps-core が turf を外せば npm でも壊れるので、移行の有無に関わらず直すべきものでした。pnpm 12 は
.npmrcのignore-scriptsを読まない既存の
.npmrcにはignore-scripts=trueがありましたが、pnpm 12 ではこの設定が黙って無効になり、esbuild のビルドスクリプトを無視したことがERR_PNPM_IGNORED_BUILDSとなって install が exit 1 になります。pnpm-workspace.yamlへ移設し.npmrcは削除しました。esbuild は 0.25 以降プラットフォーム別パッケージを optionalDependencies で解決するので、ビルドスクリプトを実行しなくても動作します(ビルドも e2e も通っています)。pnpm packは.gitignore/.npmignoreを同梱するnpm は常に除外しますが pnpm は含めます。
.npmignoreに明示して公開物を一致させました。publish も pnpm に
pnpm 12 が OIDC trusted publishing に対応していることをバイナリ内の文字列で確認しました(
/-/npm/v1/oidc/token/exchange/package/、ACTIONS_ID_TOKEN_REQUEST_URL、provenance 生成)。現行の公開も実際に trusted publishing です。これを維持するため、publish ステップはこうしています。
--provenance: npm は OIDC publish で provenance を自動付与しますが、pnpm は明示が必要--no-git-checks: 無いと落ちます。 publish ジョブはタグを checkout したうえにビルド成果物を作業ツリーへ展開するので、pnpm 既定の git チェック(ERR_PNPM_GIT_UNCLEAN/ERR_PNPM_GIT_NOT_CORRECT_BRANCH)に引っかかりますnpm install -g npm@latestステップは不要になったので削除実際に publish が通るかはタグを打つまで確認できないので、ここだけ残存リスクです。
その他
pnpm/action-setupはsetup-nodeより前に置く必要があります(cache: 'pnpm'が store path を引くため)package.jsonのpackageManagerに固定(pnpm@12.9.1)。pnpm/action-setupはここから読みますpnpm/action-setupは v6.1.0 を commit SHA で固定しています。当初@v4にしていましたが、pnpm v12 対応は v6.1.0(feat: support pnpm v12 pnpm/action-setup#288)で入ったもので、packageManagerにpnpm@12.9.1を固定している以上 v4 では動きません。サードパーティ製アクションなので SHA 固定にしました(既存のactions/*はタグ参照のままで、この PR では触っていません)副次的な効果
Node 22 同梱の npm 10 は
vitest ^4.1.1の peer 解決で arborist が落ち、ローカルで lock を再生成できませんでした(#519 で実際に踏み、やむを得ず npm 11 で生成)。pnpm にすることでこの問題から外れます。2. embed-core.js のライセンス表記(#519 由来の退行の修正)
移行検証中に気づきました。6.0.0-pre.4 の
dist/embed-core.jsは maplibre-gl v6 を 1.7 MB ぶん同梱しながら、ライセンス表記もdist/embed-core.js.LICENSE.txtも持たない状態で公開されています。 BSD-3-Clause の表示義務に関わります。dist/embed.js.LICENSE.txt、dist/embed-core.js.LICENSE.txt、チャンク 2 本dist/embed.js.LICENSE.txt、チャンク 2 本(embed-core は無し)原因
terser です。maplibre のソース先頭の
@licenseコメントは通常extractCommentsが<bundle>.js.LICENSE.txtへ切り出しますが、terser はコメント単体ではなく「コメントが付いているコード」を基準に扱うため、そのコードが削除・並べ替えされるとコメントごと消え、extractCommentsまで届きません。minimize: falseでビルドすると未圧縮バンドルには banner が残っていることを確認しました。embed.jsだけ残るのは偶然です。embed.tsがObject.assign(..., maplibregl, ...)で名前空間を丸ごと使うため全体が生き残るのに対し、embed-core.tsは maps-core 経由の一部シンボルしか使わないので落ちます。pre.3 まで出ていたのも maplibre 5 系の構造でたまたま残っていただけで、明示していない以上いつ壊れてもおかしくない状態でした。修正
BannerPluginで明示します。バージョンはmaplibre-gl/package.jsonから読むので手で追従する必要はありません。pre.3 と同じ形に戻ります。BannerPlugin は terser より前の段階で走るので banner は通常どおり
extractCommentsに拾われ、embed.js側は terser が同一コメントを重複排除するため二重になりません(両方ビルドして確認済み)。チャンク側の LICENSE.txt(is-plain-object等)も従来どおり出ます。公開済み pre.4 の tarball とのパス差分は
dist/embed-core.js.LICENSE.txtが 1 件増えるだけです。3. CHANGELOG / リリース
pre.4 は公開済みなので
### Unreleasedセクションを新設しました。バージョン番号の決定はリリース時の判断としてこの PR では触っていません。見出しの改名だけで済むようにしてあります。4. 検証
pnpm 12.9.1 / Node 22.21.0 で、すべて green です。
pnpm install --frozen-lockfile(CI と同じ)tsc --noEmitpnpm run lintpnpm run test— 15 passedpnpm run build— Critical dependency 警告なしpnpm exec playwright test --workers=1— 20 passed(CI と同じ直列実行)maplibre-glが 1 コピーのままであること、ワークフロー YAML が意図どおりパースされること(build/e2e/publishのステップ順)も確認済みです。5. 今回触っていないもの
filesallowlist 化:files: ["dist"]にすると 65 → 23 ファイルになり、src//e2e// CI 設定 / エディタ設定が配布物から外れます(CHANGELOG.mdとPLUGIN.mdも消えるので、残すなら列挙が必要)。tarball は 1,539,857 → 1,530,217 bytes とほぼ変わらないので動機はサイズではなく衛生面です。.npmignoreも丸ごと不要になります。別 issue にするのが筋だと思います。typesフィールドが壊れている:typesとexports.*.typesがdist/src/embed.d.tsを指していますが、このパスは公開物に存在しません(実体はdist/embed.d.ts)。既存バグです。6. セルフレビューで確認したこと / 見ていないこと
zizmorを master と本ブランチで比較しました。この PR による新規の指摘はありません。adhoc-packagesが 1 → 0 に減っているのはnpm install -g npm@latestを削除したためです。@v4のままだとunpinned-usesが 17 → 20 に増えていたので、SHA 固定で元に戻しています。if:条件はいずれも既存のままで、増減させていません。publishジョブはstartsWith(github.ref, 'refs/tags/v')が false なら丸ごとスキップ、latest/nextの 2 ステップは-pre.の有無で排他です。fork からの PR ではbuild/e2eだけが走り、どちらも secret を使いません。見ていないもの:
pnpm-lock.yaml(7530 行)は行単位で読んでいません。--frozen-lockfileが通ること、テスト一式が通ることで担保していますgh-pages/deployジョブは変更していません。npm を使っていないことの確認にとどめていますnetlify.tomlはなく、サイト側の設定を見られません。package-lock.jsonの削除が deploy preview に影響しないかは、この PR の Netlify チェックで確認しますSummary by CodeRabbit