🧑‍💻

package-lock.jsonとnpm-shrinkwrap.jsonの使い分け

2021/09/02に公開

最近リポジトリによって使い分けられてるのを見つけて調べたのでまとめ

忙しい人向け

package-lock.json使っといたほうがよい

package-lock.jsonとは

npm installを叩くとできるやつ
依存関係にあるnpmパッケージのバージョンを固定するもの
たまにこれをgit ignoreしてる人いるけど複数人で開発するときバージョンで動作変わったらどうするんだろうか

詳しく知りたい人は公式へ
https://docs.npmjs.com/cli/v6/configuring-npm/package-lock-json

npm-shrinkwrap.jsonとは

npm shrinkwrapを叩くとできるやつ
package-lock.jsonと同じく依存関係にあるnpmパッケージのバージョンを固定するもの

詳しく知りたい人は公式へ
https://docs.npmjs.com/cli/v7/commands/npm-shrinkwrap

package-lock.jsonとnpm-shrinkwrap.jsonの違い

自分が調べた範囲だと2つの差分があった

npm auditの挙動

脆弱性を解消する便利コマンドnpm audit
https://docs.npmjs.com/cli/v7/commands/npm-audit

これを実行したときにnpmのバージョンによって挙動が変わる
npm6系のときは差分はない
ドキュメント読んで差分なさげって思っただけで動かしてない
しかしnpm7系のときに挙動が変わる
package-lock.jsonがないぞってエラーを吐いて動かなくなる

なので、npm auditをつかう上ではnpm-shrinkwrap.jsonを使うメリットはない

npmのパッケージとしてpublishしたときの挙動

大きな機能差分これ
package-lock.jsonを使っていた場合、利用者側で依存関係のバージョンを変える事ができる
以下のpackage.jsonを持つ2種類のパッケージを依存関係に持つとする

  "devDependencies": {
    "@babel/core": "^7.0.0",
    ・・・
 "devDependencies": {
   "@babel/core": "^7.1.0",
   ・・・

package-lock.jsonの場合はバージョンを固定できないので、npm installを実行したタイミングでよしななバージョンが入る
この場合は7系の最新のものが入る

npm-shrinkwrap.jsonを使っており、7.1.1で固定さている場合
npm installを実行したタイミングで7.1.1より新しいバージョンがあったとしても、7.1.1が入る

あえてレンジじゃなくて、バージョンを固定したいみたいなケースは稀な気がするが、こういうことしたいときにnpm-shrinkwrap.jsonを使うとよい

まとめ

特殊な使い方をしない限りはpackage-lock.jsonをつかったほうが良い

元ネタ

https://stackoverflow.com/questions/44258235/what-is-the-difference-between-npm-shrinkwrap-json-and-package-lock-json

Discussion