できない.dev

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 バージョンを揃えること。

よくある原因

  1. ロックファイル未更新: package.json の依存を変えたのに pnpm install を流さず、pnpm-lock.yaml が古いまま。
  2. コミット漏れ: ロックファイルが .gitignore に入っている、または add し忘れていて CI に届いていない。
  3. バージョン差: ローカルが pnpm 8、CI が pnpm 9 などでロックファイルの形式が変わり不一致になる。
  4. 手書き編集: 依存やバージョンを手で書き換え、ロックファイルと整合しなくなった。

解決策

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 install

3. ロックファイルが commit される設定か確認する

.gitignorepnpm-lock.yaml が紛れていないかを見る。
CI のチェックアウトに含まれていなければ frozen は必ず失敗する。

git check-ignore pnpm-lock.yaml   # 何も出なければ追跡対象

この記事は役立ちましたか?