本ページは npm.org 提供文書を翻訳したものです。 原文は 本家参照 、誤謬・誤記の指摘は こちら からお願いします。 ×

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 方法:

  1. 現在のバージョンの全ての依存性をインストールするために "npm install" を実行します。
  2. パッケージが期待されるバージョンで動作するかを確認します。
  3. "npm shrinkwrap" を実行し、 npm-shrinkwrap.json を git に追加して、npm パッケージを配布します。

shrinkwrap パッケージ内の依存性を追加、更新するには:

  1. 現在のバージョンの全ての依存性モジュールをインストールにするために "npm install" をパッケージルートで実行します。
  2. 依存性を追加、更新します。"npm install" 個々のパッケージについて個別に実行し、package.json を更新します。 インストールする順序正しく行うことに注意して下さい。 引数無しで実行するnpm install は単に存在している 梱包(shrinkwrap) を再現するに過ぎません。
  3. 新しい依存モジュールで正しく動作していることを確認します。
  4. "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% 信頼可能なものがほしい、など パッケージに含まれる具体的な中身を制御したいのであれば、実際のソースを 確認するか、バージョンではなく、内容を精査する別のメカニズムで追跡する 必要があります。

参考

© Liberty Technology リンクフリーです。再構成・再配布については こちら からお問い合わせ下さい。