できない.dev

npm ci が package-lock.json と不一致で失敗する

npm ci は package.json と package-lock.json が完全に一致していることを前提とし、ズレると EUSAGE エラーで即停止する。
手元で npm install を実行して lockfile を更新し commit するのが正攻法。

#npm#npm-ci#package-lock#lockfile#ci

公開:

要約

npm error code EUSAGE とともに npm ci can only install packages when your package.json and package-lock.json or npm-shrinkwrap.json are in sync が出るのは、package.jsonpackage-lock.json がズレている状態。npm ci は lockfile を一切更新しない設計なので、npm install のように自動で辻褄を合わせず即エラーで止まる。

よくある原因

  1. lockfile 未更新: package.json の依存を書き換えたが npm install をしておらず、package-lock.json が古いまま。
  2. lockfile の手編集・マージ事故: package-lock.json を手で触った、あるいはコンフリクトを雑に解決して不整合が残った。
  3. 同期漏れのコミット: 他のメンバーが依存を足したのに lockfile を commit し忘れている。
  4. lockfileVersion 差: npm 6 と 9 以降など世代差で lockfileVersion が変わり、整合チェックに引っかかる。

解決策

1. lockfile を更新して commit する

npm install
git add package-lock.json
git commit -m "chore: sync package-lock.json"

npm-ci のドキュメントにあるとおり、npm ci は lockfile が package.json と一致しなければエラー終了する。
lockfile を書き換えられるのは npm install 側だけ。

2. 不一致パッケージを特定する

npm error Invalid: lock file's left-pad@1.3.0 does not satisfy left-pad@1.4.0

エラー本文に食い違っているパッケージ名と版が出るので、確認してから意図した版に揃える。

3. npm バージョンを CI と揃える

ローカルと CI(setup-node の node-version 指定など)で npm のメジャーバージョンを合わせると lockfileVersion の食い違いを防げる。npm -v で双方を確認する。

4. 壊れた lockfile を作り直す

rm package-lock.json
npm install
git diff package-lock.json

どうしても直らないときは再生成し、差分に意図しないバージョン上げが無いかレビューしてから commit する。

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