web-dev-qa-db-ja.com

npm-shrinkwrap.jsonとpackage-lock.jsonの違いは何ですか?

リリースのnpm @ 5 では、package-lock.jsonがすでに存在しない限り、npm-shrinkwrap.jsonを書き込むようになりました。

私はnpm @ 5をグローバルにインストールしました。

npm install [email protected] -g

そして今、npm-shrinkwrap.jsonが以下の間に見つかった場合:

npm install

警告が表示されます。

npm WARN read-shrinkwrap This version of npm
is compatible with [email protected],
but npm-shrinkwrap.json was generated for [email protected]
I'll try to do my best with it!

だから私のテイクアウトは、私はpackage-lock.jsonでシュリンクラップを交換する必要があるということです。

それでも、なぜ新しいフォーマットがあるのでしょうか。 package-lock.jsonnpm-shrinkwrap.jsonにできないことは何ができますか?

125
k0pernikus

これらのファイルはまったく同じ内容ですが、npmによる処理方法にはわずかな違いがあります。 docsサイト 、および npmリポジトリのdocsファイルにも説明があります。これら2つのファイル の違いを明示的に説明することから始めます。

  • package-lock.jsonはnpmに公開されることはありませんが、npm-shrinkwrapはデフォルトで
  • 最上位パッケージにないpackage-lock.jsonファイルは無視されますが、依存関係に属するシュリンクラップファイルは尊重されます
  • npm-shrinkwrap.jsonはnpmバージョン2、3、および4と下位互換性がありますが、package-lock.jsonはnpm 5以降でのみ認識されます。

package-lock.jsonを実行すると、既存のnpm-shrinkwrap.jsonnpm shrinkwrapに変換できます。

したがって:

  • あなたがあなたのパッケージをnpmに公開していないのであれば、これら二つのファイルの間の選択はほとんど意味がありません。 package-lock.jsonはデフォルトであり、その名前はnpm初心者にとってより明確なので、使用することをお勧めします。あるいは、開発チームの全員が午後5時以降になるようにするのが難しい場合は、npm 2-4との下位互換性のためにnpm-shrinkwrap.jsonを使用することをお勧めします。 (npm 5は2017年5月25日にリリースされたことに注意してください。後日の互換性は、ほとんどの人が最終的にアップグレードするので、その日から遠ざかるにつれてますます重要でなくなるでしょう。)
  • あなたが are あなたのパッケージをnpmに公開しているなら、あなたは以下の中から選択をすることができます:

    1. package-lock.jsonを使用して、インストールした依存関係のバージョンを正確に記録します。ただし、パッケージをインストールする人は、package.jsonで指定されたバージョン範囲と互換性のある任意のバージョンの依存関係を使用できます。
    2. npm-shrinkwrap.jsonを使って、あなたのパッケージをインストールした全員が 正確に すべての依存関係の同じバージョンを手に入れることを保証します


    [非常に簡潔に] docsに記述されている公式の見解は、(おそらく、パッケージの依存関係の多くがすべてのバージョンのわずかに異なるバージョンに依存するときに引き起こされるパッケージの重複の量を減らすために)オプション1を使用するべきです。同じ副次的な依存関係もありますが、そのオプション2は、グローバルにインストールされる予定の実行可能ファイルには妥当な場合があります。

131
Mark Amery

NPM開発者からの説明

Package-lock.jsonがシュリンクラップテクノロジの最新かつ最高のものになり、npm-shrinkwrap.jsonが、正確なnode_modulesを持つライブラリを非常に気にかけている貴重な少数の人々のために予約されるのは確実です。 npm @> = 2を使用してCIにnpmバージョンをぶつけることなく特定のツリーをインストールすることを望む人々のために。

新しいlockfile( "package-lock.json")は基本的に同じコード、npm-shrinkwrapとまったく同じフォーマットをすべて共有しています(相互に名前を変更できます)。それはコミュニティが理解しているようなものでもあります:「それはロックファイルを持っています」は人々と共にとても速くクリックするようです。最後に、新しいファイルを持っているということは、親の記事で述べたallow-publishingのような奇妙なことをしなくても、比較的低リスクの後方互換性を持つシュリンクラップと互換性があることを意味します。

25
SeriousM

私の考えでは、 - saveとshrinkwrapはデフォルトで行われますが、望まれていないところでshrinkwrapが発生することによる潜在的な問題は避けてください。そのため、競合を避けるために、新しいファイル名を付けただけです。 npmからの誰かがここでもっと徹底的にそれを説明しました:

https://www.reddit.com/r/javascript/comments/6dgnnq/npm_v500_released_save_by_default_lockfile_better/di3mjuk/

関連する見積もり

npmはデフォルトであなたのソースディレクトリのほとんどのファイルを公開します、そして人々は何年もシュリンクラップを公開してきました。互換性を壊したくはありませんでした。デフォルトで--saveとshrinkwrapを使うと、それが誤ってレジストリに入り込んで伝播する危険性が高く、基本的にdepsとdedupeを更新する能力を無効にします。

そこで私たちは新しい名前を選びました。そして私たちは突然新しい名前を選びました。新しいロックファイルは基本的にすべて同じコード、まったく同じフォーマットを共有します。

12
Cody Brumfield