npm-shrinkwrap
依存バージョンを制限する
概要
npm shrinkwrap
説明
このコマンド(shrinkwrap:梱包)はパッケージの依存モジュールバージョンを制限することが できるため、パッケージがインストールされたとき、依存モジュールのどの バージョンがインストールされるかを正確にコントロールすることが できます。"npm install" を利用したい場合は "package.json" が必要です。
基本的に、 "npm install" は再帰的に semver パターンを満足する最新の依存モジュールをインストールします (package.json に定められた通りにです)。 いくつかの場合、特にそれぞれの変更が厳しく管理されているパッケージを 提供する場合、再帰的にそれぞれのバージョンを完全に決定することが でき、後続処理により、semver のパターンを満足する新しいモジュールを うっかり持ってくることがなくなります。 それぞれの依存モジュールの package.json で semver パターンを利用して 実現することは容易です。しかし、他人が管理している npm パッケージを 用いる場合にはできないこともあります。 ソース内で直接コントロールすることもできます。しかしこれは他の理由に より、望ましくありません。
パッケージ Aを例に考えます:
{
"name": "A",
"version": "0.1.0",
"dependencies": {
"B": "<0.1.0"
}
}
パッケージ B:
{
"name": "B",
"version": "0.0.1",
"dependencies": {
"C": "<0.1.0"
}
}
そしてパッケージ C:
{
"name": "C,
"version": "0.0.1"
}
もしA, B, C ともに上記バージョンのみがnpmレジストリに登録されている場合、 "npm install A" は次のインストールを行います:
A@0.1.0
`-- B@0.0.1
`-- C@0.0.1
しかしながら、B@0.0.2 (訳注※パッケージBのバージョン0.0.2)が 登録されている場合、新規で行う "npm install A" は次のインストールを行います:
A@0.1.0
`-- B@0.0.2
`-- C@0.0.1
Bの依存関係が変更されていない場合です。 もちろん新バージョンのBは新バージョンのCおよびその他新依存モジュール を適切なバージョンで適宜インストールします。 もしこの変更が望ましくない場合、Aパッケージの依存性は B@0.0.1 と 特定することが出来ますが、AとBの作者が異なった場合、Cの新しい バージョンも取り込みたくない、という手段がありません。
こういった場合に, A の作者は下のコマンドを利用します。
npm shrinkwrap
以下のようなこのコマンドは npm-shrinkwrap.json を作成します:
{
"name": "A",
"version": "0.1.0",
"dependencies": {
"B": {
"version": "0.0.1",
"dependencies": {
"C": {
"version": "0.1.0"
}
}
}
}
}
shrinkwrap コマンドは現在 node_modules 内にインストールされている モジュールを基本として、依存性を制限します。 "npm install" がパッケージルートに npm-shrinkwrap.json のあるパッケージに対して行われた場合、shrinkwrap ファイルは (package.json ファイルに優先して) その依存モジュールを含め再帰的にインストールされます。なので、 その作者は A@0.1.0 そして続いて B@0.0.1と C@0.1.0を利用する モジュールを A, B, C, それぞれの package.json を気にすることなく 配布できたことになります。
shrinkwrap パッケージの使い方
shrinkwrap パッケージの使い方は他のパッケージと違いはありません: "npm install" を実行するか、依存性を package.json に追加してから "npm install" を実行します。
shrinkwrap パッケージのビルド方法
既存パッケージの shrinkwrap 方法:
- 現在のバージョンの全ての依存性をインストールするために "npm install" を実行します。
- パッケージが期待されるバージョンで動作するかを確認します。
- "npm shrinkwrap" を実行し、 npm-shrinkwrap.json を git に追加して、npm パッケージを配布します。
shrinkwrap パッケージ内の依存性を追加、更新するには:
- 現在のバージョンの全ての依存性モジュールをインストールにするために "npm install" をパッケージルートで実行します。
- 依存性を追加、更新します。"npm install"
個々のパッケージについて個別に実行し、package.json を更新します。
インストールする順序正しく行うことに注意して下さい。 引数無しで実行する
npm install
は単に存在している 梱包(shrinkwrap) を再現するに過ぎません。 - 新しい依存モジュールで正しく動作していることを確認します。
- "npm shrinkwrap"を実行し、新しい npm-shrinkwrap.json をコミット、そしてパッケージの配布(訳注※npm publish) を実行します。
npm-outdated(1) で利用可能なバージョンおける依存性を表示することができます。
他の注意点
shrinkwrapファイルはパッケージの package.json ファイルと一貫していなければなりません。 必須モジュールが既にインストールされていなければ、 shrinkwrap は正しく動作しないため、"npm shrinkwrap"は失敗します。 同様に、package.jsonに参照されていないファイルがある場合、それは package.json が正しくないという意味で、コマンドは失敗します。
"npm shrinkwrap" は製品化時に依存性を固定する意図があるため、
devDependencies
は
--dev
オプションを
npm shrinkwrap
実行時に付与しない限り含まれません。 もし
devDependencies
が省かれた場合、npm は警告を 出力します。もしこれらを既定でインストールする場合、
dependencies
に加えることを考えてみて下さい。
shrinkwrap パッケージA が shrinkwrap パッケージB に 依存している場合は、Bの shrinkwrap は A の一部として 用いられることはありません。しかしながら、shrinkwrap パッケージA は パッケージB とその依存モジュールの再帰的で正確なインストールから 構成されているので、shrinkwrap パッケージA のインストールに shrinkwrap パッケージB が含まれることを意味します。
注意
shrinkwrap ファイルはパッケージバージョンを制御するもので、 その実際の中身は制御しません。残念なことにパッケージ作者は 同じバージョンを再配布可能なため、異なるものに差し代わることが あります。 もし作者が差し替え、あなたのアプリケーションに 被害を与える、という難解なリスクを避けたいのであれば、shrinkwrap ファイルをバージョンではなく git URL の参照にしすることで、 npm は常に git からパッケージを取得することになります。
もし、配置やビルドを再現する、100% 信頼可能なものがほしい、など パッケージに含まれる具体的な中身を制御したいのであれば、実際のソースを 確認するか、バージョンではなく、内容を精査する別のメカニズムで追跡する 必要があります。