package-lock.jsonとnpm-shrinkwrap.jsonの使い分け
最近リポジトリによって使い分けられてるのを見つけて調べたのでまとめ
忙しい人向け
package-lock.json使っといたほうがよい
package-lock.jsonとは
npm install
を叩くとできるやつ
依存関係にあるnpmパッケージのバージョンを固定するもの
たまにこれをgit ignoreしてる人いるけど複数人で開発するときバージョンで動作変わったらどうするんだろうか
詳しく知りたい人は公式へ
npm-shrinkwrap.jsonとは
npm shrinkwrap
を叩くとできるやつ
package-lock.jsonと同じく依存関係にあるnpmパッケージのバージョンを固定するもの
詳しく知りたい人は公式へ
package-lock.jsonとnpm-shrinkwrap.jsonの違い
自分が調べた範囲だと2つの差分があった
npm auditの挙動
脆弱性を解消する便利コマンド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をつかったほうが良い
元ネタ
Discussion