pnpm install が CI で frozen-lockfile により失敗する(ERR_PNPM_OUTDATED_LOCKFILE)
CI の pnpm は既定で frozen-lockfile になり、pnpm-lock.yaml が package.json と不一致だと失敗する。
ローカルで install してロックファイルを更新・コミットし、pnpm のバージョンを固定するのが本筋。
#pnpm#frozen-lockfile#ci#lockfile#outdated
公開:
要約
ERR_PNPM_OUTDATED_LOCKFILE Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with package.json は、CI で pnpm が --frozen-lockfile モードになり、ロックファイルがマニフェストと一致しないため止まった状態。
pnpm は CI を検知すると自動でこのモードになる。
直し方は、ローカルで pnpm install してロックファイルを最新化・コミットし、ローカルと CI の pnpm バージョンを揃えること。
よくある原因
- ロックファイル未更新:
package.jsonの依存を変えたのにpnpm installを流さず、pnpm-lock.yamlが古いまま。 - コミット漏れ: ロックファイルが
.gitignoreに入っている、または add し忘れていて CI に届いていない。 - バージョン差: ローカルが pnpm 8、CI が pnpm 9 などでロックファイルの形式が変わり不一致になる。
- 手書き編集: 依存やバージョンを手で書き換え、ロックファイルと整合しなくなった。
解決策
1. ロックファイルを更新してコミットする
ローカルで install し直し、差分が出たロックファイルを必ずコミットする。
pnpm install
git add pnpm-lock.yaml
git commit -m "chore: update pnpm-lock.yaml"CI が frozen-lockfile になるのは仕様で、ロックファイルが最新ならそのまま通る(pnpm install)。
2. pnpm のバージョンを固定する
ローカルと CI で同じメジャーを使う。package.json に宣言しておく。
{
"packageManager": "pnpm@9.15.0"
}CI では Corepack で同じバージョンを有効化する(Continuous Integration)。
corepack enable
corepack prepare pnpm@9.15.0 --activate
pnpm install3. ロックファイルが commit される設定か確認する
.gitignore に pnpm-lock.yaml が紛れていないかを見る。
CI のチェックアウトに含まれていなければ frozen は必ず失敗する。
git check-ignore pnpm-lock.yaml # 何も出なければ追跡対象