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.json と package-lock.json がズレている状態。npm ci は lockfile を一切更新しない設計なので、npm install のように自動で辻褄を合わせず即エラーで止まる。
よくある原因
- lockfile 未更新:
package.jsonの依存を書き換えたがnpm installをしておらず、package-lock.jsonが古いまま。 - lockfile の手編集・マージ事故:
package-lock.jsonを手で触った、あるいはコンフリクトを雑に解決して不整合が残った。 - 同期漏れのコミット: 他のメンバーが依存を足したのに lockfile を commit し忘れている。
- 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 する。