## 概要 [[pnpm]]を 10.26.0 -> 11.0.0 にバージョンアップし、変更点を把握・確認する。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://pnpm.io/img/favicon.png" /> <span class="link-card-v2-site-name">pnpm.io</span> </div> <div class="link-card-v2-title"> pnpm 11.0 | pnpm </div> <div class="link-card-v2-content"> pnpm 11 is here! This release tightens the security defaults introduced throughout the v10 cycle, drops the npm ... </div> <img class="link-card-v2-image" src="https://pnpm.io/img/ogimage.png" /> <a href="https://pnpm.io/blog/releases/11.0"></a> </div> 関係ないところで少しハマった。。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" /> <span class="link-card-v2-site-name">Minerva</span> </div> <div class="link-card-v2-title"> 📝miseでpnpmのv11をアップデートしようとするとno asset foundエラーになる </div> <div class="link-card-v2-content">miseでpnpm v11にアップデートしようとした際、`no asset found: pnpm-macos-arm64, pnpm-macos-universal`エラーが発生した。pnpm v11でmacOS向けasset名が`pnpm-darwin-arm64.tar.gz`などに変更された一方、mise組み込みのAquaパッケージレジストリが古いasset名を参照したままで、aqua.baked_registryをfalseに設定してキャッシュをクリアしたところ、最新レジストリが使われてアップデートに成功した。</div> <img class="link-card-v2-image" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/troubleshooting.webp" /> <a data-href="📝miseでpnpmのv11をアップデートしようとするとno asset foundエラーになる" class="internal-link"></a> </div> %%[[📝miseでpnpmのv11をアップデートしようとするとno asset foundエラーになる]]%% ## マイグレーション方法 プロジェクトルートに移動し、以下のコマンドでいける。(グローバル設定は不明) ```console pnpx codemod run pnpm-v10-to-v11 ``` <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://pnpm.io/img/favicon.png" /> <span class="link-card-v2-site-name">pnpm.io</span> </div> <div class="link-card-v2-title"> Migrating from v10 to v11 | pnpm </div> <div class="link-card-v2-content"> pnpm v11 introduces several breaking changes to how configuration is read and which settings are available. Most ... </div> <img class="link-card-v2-image" src="https://pnpm.io/img/ogimage.png" /> <a href="https://pnpm.io/11.x/migration"></a> </div> ## 気になる変更点 ### 古い[[Node.js]]バージョンのサポート終了 [[Node.js]] v22以上が必要になる。 ### デフォルト設定の変更 最後の設定以外はデフォルトしておけば、[[サプライチェーン攻撃]]に対する心強い対策になる。 | 設定 | default | 意味合い | | ----------------------------------------------------------- | ----------- | ---------------------------------------------------------------------------------- | | [[minimumReleaseAge (pnpm)\|minimumReleaseAge]] | `1440` (1日) | リリースされたパッケージは1日経過しないとインストールされない。 | | [[minimumReleaseAgeStrict (pnpm)\|minimumReleaseAgeStrict]] | `false` | 新規依存関係などのケースでは、[[minimumReleaseAge (pnpm)\|minimumReleaseAge]]の期間に関係なくインストールを許容する。 | | [[blockExoticSubdeps (pnpm)\|blockExoticSubdeps]] | `true` | [[推移的依存関係]]に信頼できないソースのプロトコルを許容しない。 | | [[strictDepBuilds (pnpm)\|strictDepBuilds]] | `true` | 依存関係の[[postinstall]]を認めず、エラーで終了させる。 | | [[optimisticRepeatInstall (pnpm)\|optimisticRepeatInstall]] | `true` | ※ 正確には分かっていない | | [[verifyDepsBeforeRun (pnpm)\|verifyDepsBeforeRun]] | `install` | `node_modules` の更新が必要ならinstallする。 | #### [[verifyDepsBeforeRun (pnpm)|verifyDepsBeforeRun]]が `install` になった [[verifyDepsBeforeRun (pnpm)|verifyDepsBeforeRun]]のでデフォルト値が `install` になったので、`node_modules` の内容に更新が必要なら、`pnpm run` や `pnpm exec` 実行時に自動インストールしてくれる。つまり、[[Go]]や[[Rust]]の挙動に近くなったということだ。 #### [[allowBuilds (pnpm)|allowBuilds]]を使っていた場合 以下の設定はすべて[[allowBuilds (pnpm)|allowBuilds]]に統一されたらしい。 - `onlyBuiltDependencies` - `onlyBuiltDependenciesFile` - `neverBuiltDependencies` - `ignoredBuiltDependencies` ### `.npmrc` から設定を読み込まなくなった (認証/レジストリ除く) `.npmrc` の設定は [[pnpm-workspace.yaml]]に移す。[[macOS]]だと `~/Library/Preferences/pnpm/config.yaml` でグローバルに設定できるので作成した。 ```yaml saveExact: true ``` saveExact が設定されたことが確認できる。 ```console $ pnpm config list { "@jsr:registry": "https://npm.jsr.io/", "registry": "https://registry.npmjs.org/", "saveExact": true, "userAgent": "pnpm/11.0.0 npm/? node/v25.9.0 darwin arm64" } ``` #### registryの設定 `@scope:registry=` と書いていたものは [[pnpm-workspace.yaml]] に書く。 ```yaml registries: default: https://registry.npmjs.org/ "@my-org": https://private.example.com/ ``` #### その他気になったもの - [[package.json]] の `pnpm` フィールドは読み込まれなくなった - `$PREFIX/etc/npmrc` も読み込まなく鳴った - ネットワーク設定(`httpProxy`, `httpsProxy`, `noProxy`, `localAddress`, `strictSsl`, `gitShallowHosts`) も [[pnpm-workspace.yaml]] に書くのを推奨 ### 内部で `npm` に流していた `pnpm` コマンドの一部が再実装/削除された 再実装されたもの。 > Reimplemented: [`publish`](https://pnpm.io/11.x/cli/publish), [`view`](https://pnpm.io/11.x/cli/view) (`info`, `show`, `v`), [`login`](https://pnpm.io/11.x/cli/login) (`adduser`), [`logout`](https://pnpm.io/11.x/cli/logout), [`deprecate`](https://pnpm.io/11.x/cli/deprecate), [`unpublish`](https://pnpm.io/11.x/cli/unpublish), [`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), [`version`](https://pnpm.io/11.x/cli/version), [`search`](https://pnpm.io/11.x/cli/search), [`star`/`unstar`/`stars`](https://pnpm.io/11.x/cli/star), [`whoami`](https://pnpm.io/11.x/cli/whoami), [`ping`](https://pnpm.io/11.x/cli/ping), [`docs`/`home`](https://pnpm.io/11.x/cli/docs). 削除されたもの。 > Removed (now throw "not implemented"): `access`, `bugs`, `edit`, `issues`, `owner`, `prefix`, `profile`, `pkg`, `repo`, `set-script`, `team`, `token`, `xmas`. [[pnpm publish]]コマンドは認証周りでいくつか注意ポイントがある。 ### [[pnpm ci]] [[pnpm clean]] -> [[pnpm install]] [[--frozen-lockfile (pnpm install)|--frozen-lockfile]] を1コマンドで実行できる。CI用に便利。 > [!warning] `"scripts": { "ci": "..." }` と設定している場合は注意 > `scripts` に `ci` が既に設定されており、今まで `pnpm ci` コマンドを実行している場合は、今回追加された [[pnpm ci]] が優先されてしまうので、`pnpm run ci` に変更する必要がある。 ### [[pnpm audit]] の `--fix=update` オプションに関する挙動変更 - `package.json` のバージョンが **exact versionである** とき - バージョン変動できないため更新されない - `package.json` のバージョンが **exact versionでない** とき - `package.json` のバージョンが更新される - ロックファイルもそのバージョンに更新される