npm-shrinkwrap.json
は package-lock.json
と基本的には同一のロックファイルです。
最大の違いは NPM パッケージの一部としてリポジトリーで公開できることです。
ロックファイル?
通常依存パッケージのバージョンは package.json
である程度の範囲をもって記述され、インストール時にその範囲内で最新のものが利用されます。
例えば package.json
での指示が "^1.2.3"
の場合、インストールされうる最低のバージョンは v1.2.3 で、範囲外である v1.2.2 がインストールされることはありません。一方最高のバージョンは v1.999.9999 など v2.0.0 よりは低くなります。
semver や記号の意味についてはまた後日詳しくやりたい。
とまあそういうわけでインストールされ得るバージョンには幅があるんですが、それを固定するのがロックファイルです。
package-lock.json
と npm-shrinkwrap.json
の違い
中身は完全に同じです。
生成方法等と除くと、最大の違いは npm-shrinkwrap.json
は NPM パッケージの一部として公開することが可能で、package-lock.json
はそれができないという点です。公開用と開発用って感じだろうか。
作り方
shrinkwrap
サブコマンドで生成します。
$ npm shrinkwrap npm notice created a lockfile as npm-shrinkwrap.json. You should commit this file.
実際のツリーが反映される
生成される npm-shrinkwrap.json
は、package.json
ではなく実際の node_modules
内のファイル構成を元に生成されます。
例えば、 npm install
に --no-save
を付けるとパッケージを package.json
へ記載することなくインストール可能です。一方で npm shrinkwrap
はそのような記載のないパッケージも全て npm-shrinkwrap.json
へ反映します。
使い方
npm-shrinkwrap.json
を生成したらそれを含めて(というか除外しないで)NPM パッケージ公開 npm publish
します。
すると、該当パッケージ利用者がそれを npm instal xxx
で導入する際にロックファイルが参照され、それを元に node_modules
が構築されます。
逆に、作者側が開発用に npm install
を実行すると、npm-shrinkwrap.json
は更新されてしまいます。このインストールは package.json
の方を参照するので、その結果の node_modules
が反映されるという仕組みのようです。ちなみに npm-shrinkwrap.json
がなければ package-lock.json
が生成されます。
おまけ:英単語 Shrinkwrap とは
shrink は「縮む」、wrap は「包み、ラップ」という意味で、合成して「収縮包装」みたいな意味です。
なんかほらあるでしょ、商品をぴっちり包む透明のフィルム。あれのことみたいです。
バージョンを固定するところがぴっちり感なのかな。
ちなみに shrinkwrap という単語からエビを連想するんだけど、どう見ても shrimp です本当にありがとうございました。
おしまい
初めてなので調べて試して書いてます。なんか違ったらおしえて。