※スマホ対応はしてません。

タグ: shrinkwrap

shrinkwrap はライブラリーでは使わない(NPMおれおれAdvent Calendar 2019 – 09日目)

カテゴリー: JavaScript

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

shrinkwrap という機能を使って、パッケージがインストールされる際の依存ツリーのバージョンを固定することができます。

できるんだけど、ライブラリーでは使わない方が良さそうです。

強く非推奨

It’s strongly discouraged for library authors to publish this file, since that would prevent end users from having control over transitive dependency updates.

ライブラリー作者がこのファイルを公開することは強く非推奨 (strongly discouraged) です。エンドユーザー側での推移的な (transitive) 依存関係更新による管理の妨げになるためです。

アプリ用

じゃあ何のためかというと、アプリ用です。アプリケーションソフトウェア。例えば CLI で動作するものや、デーモンとして利用されるものです。

The recommended use-case for npm-shrinkwrap.json is applications deployed through the publishing process on the registry: for example, daemons and command-line tools intended as global installs or devDependencies.

npm-shrinkwrap.json の推奨される利用事例は、レジストリー上の公開プロセスを経由してデプロイされるアプリケーションです。例えばグローバルインストールや devDependencies を意図したデーモンやコマンドラインツールが該当します。

というわけでコードから import() するようなものは固定しないようにしましょう。

おしまい

正直「推移的な依存関係更新」というのがよくわかってないんですが、お任せした方が良いようです。

参照

shrinkwrap でパッケージのバージョンを固定できるよ(NPMおれおれAdvent Calendar 2019 – 08日目)

カテゴリー: JavaScript

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

おしまい

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

参照