HERSHY'SのAdvent Calendar(本物)の8日目を開けたところ。
NPMおれおれAdvent Calendar 2019 – 08日目

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 です本当にありがとうございました。

おしまい

初めてなので調べて試して書いてます。なんか違ったらおしえて。

参照