## 概要
[[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` のバージョンが更新される
- ロックファイルもそのバージョンに更新される