できない.dev

pnpm install が「ERR_PNPM_IGNORED_BUILDS」で失敗して依存をインストールできない

ERR_PNPM_IGNORED_BUILDS は、pnpm 11 以降で未承認のビルドスクリプトがあると出る。
pnpm approve-builds で許可するか、allowBuilds に書けば直る。

公開: 更新:

症状できない · exit 1
pnpm install
…
Error: ERR_PNPM_IGNORED_BUILDS
  × installing dependencies
  ╰─▶ Ignored build scripts: esbuild@0.28.2
解決後できた · exit 0
pnpm install
Already up to date
Done in 1ms using pnpm v12.9.1

2026-10-28 に node:22-bookworm-slim(pnpm 12.9.1 / Node.js 22.23.4) で実際に打って取った出力。検証環境の詳細

要約

ビルドスクリプト(postinstall など)を持つ依存が入っていると、pnpm 12.9.1 の pnpm install は依存を配置し終えたあとで次のように失敗する。

Error: ERR_PNPM_IGNORED_BUILDS
 
  × installing dependencies
  ╰─▶ Ignored build scripts: esbuild@0.28.2
  help: Run "pnpm approve-builds" to pick which dependencies should be allowed
        to run scripts.

pnpm 10 から、依存パッケージのビルドスクリプトは許可したものしか実行されなくなった。
インストール時に任意のコードが走るのを防ぐための仕組みだ。
10 系では警告を出すだけで終了コードは 0 だったが、pnpm 11(新しいタブで開く) で strictDepBuilds の既定値が true になり、未承認のスクリプトが残っているとエラーで終わる。
esbuild 0.28.2 だけを依存に持つプロジェクトで比べると、10.34.6 は警告で終了コード 0、11.28.2 と 12.9.1 は終了コード 1 だった。
11.28.2 の表示は [ERR_PNPM_IGNORED_BUILDS] Ignored build scripts: esbuild@0.28.2 の 1 行の形になる。
CI の pnpm install --frozen-lockfile も同じく終了コード 1 で止まる。

実行例

node:22-bookworm-slim で pnpm 12.9.1 を使い、esbuild を依存に入れて pnpm install すると、ERR_PNPM_IGNORED_BUILDS で終了コード 1 になった。pnpm approve-builds esbuild で allowBuilds が書かれると通り、onlyBuiltDependencies のままでは同じエラーが出た。

$ pnpm install
Downloading the pnpm 12.9.1 binary for linux-x64...
Update available! 12.9.1 → 12.15.0.
Changelog: https://pnpm.io/v/12.15.0
To update, run: curl -fsSL https://get.pnpm.io/install.sh | sh -
Packages are copied from the content-addressable store to the virtual store.
  Content-addressable store is at: /root/.local/share/pnpm/store/v11
  Virtual store is at:             node_modules/.pnpm
Packages: +2
++
Progress: resolved 2, reused 0, downloaded 2, added 2, done
 
dependencies:
+ esbuild 0.28.2
 
Error: ERR_PNPM_IGNORED_BUILDS
 
  × installing dependencies
  ╰─▶ Ignored build scripts: esbuild@0.28.2
  help: Run "pnpm approve-builds" to pick which dependencies should be allowed
        to run scripts.
$ echo $?
1
$ pnpm approve-builds esbuild
✓ Lockfile passes supply-chain policies (verified 76ms ago)
Already up to date
.../esbuild@0.28.2/node_modules/esbuild postinstall$ node install.js
.../esbuild@0.28.2/node_modules/esbuild postinstall: Done
$ cat pnpm-workspace.yaml
allowBuilds:
  esbuild: true
$ pnpm install
Already up to date
Done in 1ms using pnpm v12.9.1
$ echo $?
0
$ cat pnpm-workspace.yaml
onlyBuiltDependencies:
  - esbuild
$ pnpm install
Progress: resolved 0, reused 1, downloaded 0, added 0
Packages are hard linked from the content-addressable store to the virtual store.
  Content-addressable store is at: /root/.local/share/pnpm/store/v11
  Virtual store is at:             node_modules/.pnpm
Packages: +2
++
Progress: resolved 2, reused 2, downloaded 0, added 2, done
 
dependencies:
+ esbuild 0.28.2
 
Error: ERR_PNPM_IGNORED_BUILDS
 
  × installing dependencies
  ╰─▶ Ignored build scripts: esbuild@0.28.2
  help: Run "pnpm approve-builds" to pick which dependencies should be allowed
        to run scripts.
$ echo $?
1
$ cat pnpm-workspace.yaml
allowBuilds:
  esbuild: true
$ pnpm install
✓ Lockfile passes supply-chain policies (verified 87ms ago)
Lockfile is up to date, resolution step is skipped
Already up to date
Done in 12ms using pnpm v12.9.1
$ echo $?
0

— 2026-10-28 時点の出力

検証環境Node.js 22.23.4 / npm 10.9.9 / pnpm 12.9.1 / 2026-10-28 検証
検証日
実行環境
node:22-bookworm-slim Debian GNU/Linux 12 (bookworm)
バージョン
  • Node.js 22.23.4
  • npm 10.9.9
  • pnpm 12.9.1

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

解決策

1. pnpm approve-builds で許可する

pnpm approve-builds esbuild

11 以降はパッケージ名を渡すと対話なしで許可でき、pnpm-workspace.yaml に次の設定が書き込まれて、そのままビルドスクリプトも実行される。
名前を省くと選択画面が開く。
10.34.6 では名前を渡しても選択画面が開いたので、10 系では画面で選ぶか、次の手順 2 のように直接書く。

allowBuilds:
  esbuild: true

書き込まれた pnpm-workspace.yaml をコミットすれば、CI でも同じ許可が効く。

2. allowBuilds に直接書く

allowBuilds(新しいタブで開く) はパッケージ名(バージョンの範囲も書ける)をキーにした対応表で、true は実行、false は実行しないで済ませる指定だ。
どちらで書いても「未承認」ではなくなるので、エラーは消える。

allowBuilds:
  esbuild: true
  core-js: false

allowBuilds は 10.26.0 で追加された設定で、10.34.6 でもこの書き方でスクリプトが実行された。
スクリプトの中身を確かめ、不要なものは false にする。
なお esbuild 0.28.2 は、スクリプトを実行しなかった状態でも esbuild --version が応答した。

3. 古い設定を書き直す

onlyBuiltDependencies: [esbuild] は allowBuilds の esbuild: true に、neverBuiltDependencies や ignoredBuiltDependencies に並べていたものは false に置き換える。package.json の pnpm フィールドにあった設定も pnpm-workspace.yaml へ移す。

すべての依存のスクリプトを無条件で実行する dangerouslyAllowAllBuilds: true もあるが、この仕組みの守りを丸ごと外すことになるので、allowBuilds で個別に許可する方を選ぶ。

よくある原因

  1. pnpm を 11 以降に上げた。
    10 系で出ていた「Ignored build scripts」の警告を見落としたまま上げると、同じ状態がエラーに変わる。
  2. 許可の設定が無い。
    ビルドスクリプトを持つ依存が、allowBuilds に true でも false でも書かれていない。
  3. 古い設定が無視されている。
    11 で onlyBuiltDependencies・neverBuiltDependencies・ignoredBuiltDependencies などが削除され、package.json の pnpm フィールドも読まれなくなった。
    12.9.1 では、pnpm-workspace.yaml の onlyBuiltDependencies は黙って無視され、package.json の pnpm.onlyBuiltDependencies は「no longer read by pnpm」の警告付きで無視されて、どちらも同じエラーになった。