package-lock.jsonの役割は何ですか?


290

npm @ 5が公開されました。混乱を招く新機能package-lock.jsonファイル(後npm install)があります。知りたいのですが、このファイルの効果は何ですか?

回答:


289

package.json自体のようにスター付きのバージョン管理を使用するのではなく、正確なバージョン管理された依存関係ツリーを格納します(例:1.0。*)。これは、他の開発者や製品リリースなどの依存関係を保証できることを意味します。これには、ツリーをロックするメカニズムもありますが、通常、package.jsonが変更されると再生成されます。

npm docsから:

package-lock.jsonは、npmがnode_modulesツリーまたはpackage.jsonを変更する操作に対して自動的に生成されます。中間の依存関係の更新に関係なく、後続のインストールで同一のツリーを生成できるように、生成された正確なツリーについて説明します。

このファイルは、ソースリポジトリにコミットすることを目的としており、さまざまな目的で使用されます。

チームメイト、デプロイメント、継続的インテグレーションがまったく同じ依存関係を確実にインストールできるように、依存関係ツリーの単一の表現を説明します。

ユーザーがディレクトリ自体をコミットする必要なく、node_modulesの以前の状態に「タイムトラベル」する機能を提供します。

読みやすいソース管理の差分を使用して、ツリーの変更の可視性を高める。

そして、npmが以前にインストールされたパッケージのメタデータ解決の繰り返しをスキップできるようにすることで、インストールプロセスを最適化します。

編集する

正確なバージョン番号を指定したpackage.jsonの使用に関するjrahhaliの質問に回答するには package.jsonには直接の依存関係のみが含まれ、依存関係の依存関係(ネストされた依存関係とも呼ばれる)は含まれないことに注意してください。これは、標準のpackage.jsonでは、それらのネストされた依存関係のバージョンを制御できず、それらを直接参照するか、ピア依存関係が役に立たないため、直接の依存関係がこれらのネストされた依存関係に対して定義するバージョン許容値も制御できないためです。

直接の依存関係のバージョンをロックダウンしても、完全な依存関係ツリーが毎回同じであることを100%保証することはできません。次に、直接の依存関係の(セマンティックバージョニングに基づく)互換性のない変更を許可すると、ネストされた依存関係をさらに制御できなくなり、直接の依存関係がセマンティックバージョニングルールに違反しないことを保証できなくなります。自分自身。

これに対するすべての解決策は、上記のように完全な依存関係ツリーのバージョンでロックするロックファイルです。これにより、他の開発者またはリリースの依存関係ツリーを保証しながら、標準のpackage.jsonを使用して新しい依存関係バージョン(直接または間接)のテストを許可できます。

NB。以前のシュリンクラップjsonはほとんど同じことを行いましたが、ロックファイルは機能を明確にするために名前を変更しています。プロジェクトにすでにシュリンクラップファイルがある場合は、ロックファイルの代わりにこれが使用されます。


78
依存関係の正確なバージョンが求められている場合は、package.jsonで正確なバージョンを指定し、package-lock.jsonファイルを無視しないようにしてください。
jrahhali 2017年

15
@jrahhali-あなたの質問に基づいて私の回答を修正しました。
マット

1
pacakge.json.lockからこの依存関係ツリーを他の開発者にどのように適用しますか?自動的に?
stevek 2017

40
この答えは正しくないことに注意してください!このpackage-lock.jsonファイルは、NPM 5.1以降、npm installを呼び出すたびに更新されます。(の変化github.com/npm/npm/issues/16866、例github.com/npm/npm/issues/17979)したがってできなくなり、すべての開発者のための同じバージョンを設定するために使用しないこと、あなたが正確なバージョンを指定しない限り、以下のような1.2.3代わりの1.2.*あなたの中package.jsonのファイル。
クリスチャン

5
あなたはへの参照を追加する必要があるnpm ciとして、npm installCIはそのコンテンツを使用するのに対し、パッケージlock.jsonを更新します。初めて、npm ci繰り返し可能な堅牢なビルドが得られます。
k0pernikus

34

これはnpmにとって非常に重要な改善です。すべてのパッケージのまったく同じバージョンを保証します

異なる環境の異なる時間に同じパッケージでプロジェクトをビルドする方法を教えてください。たとえば、で使用^1.2.3したりpackage.json、一部の依存関係がそのように使用しているとnpm installしますが、開発マシンとビルドサーバーで毎回同じバージョンを取得できるようにするにはどうすればよいですか?package-lock.jsonそれを保証します。

npm installビルドサーバーまたはデプロイメントサーバー上でロックファイルを再生成しますnpm ci(ロックファイルから読み取り、パッケージツリー全体をインストールします)。


9
これは少し時代遅れになっていることに注意してください。5.1.0以降では、「npm install」はpackage-lock.jsonファイルからまったく読み取りません。いつものpackage.jsonようにインストールするだけです。このpackage-lock.jsonファイルを使用するには、新しい「npm ci」コマンドを使用する必要があります。これpackage-lock.jsonにより、で指定されたバージョン範囲の代わりに、リストされている正確なバージョンがインストールされpackage.jsonます。
Venryx

5
Venryxが間違っていると思います。 npm install から読み取りますpackage-lock.json。再現するには、次の操作を行います。このpackage.jsonを使用して、npm install{... "devDependencies":{"sinon": "7.2.2"}} package.jsonを実行package-lock.jsonし、新しいディレクトリにコピーして貼り付けます。変更package.json: "sinon": "^ 7.2.2" run npm install。npmは、package-lock.jsonから読み取り、7.3.0ではなく7.2.2をインストールします。package-lock.jsonがなければ、7.3.0がインストールされます。
zumafra

2
それだけでなく、キャレット^をに追加するようなことをしたい場合package-lock.jsonは、を使用package-lock.jsonして削除して再生成するのが唯一の合理的な方法npm installです。(手動で編集する必要はありませんpackage-lock.json)。「上部」の(バージョンの近くにある)プロパティの値をpackage.json変更すると、でも同じように変更さpackage-lock.jsonnpm installますが、依存関係にキャレットを追加しても、には同じことが行われませんpackage-lock.json
zumafra

1
package.json手動で変更できるもの、手動で変更することはできないものと考えてくださいpackage-lock.json。あなたは常に両方のファイルをバージョン管理します-特にpackage-lock.json。両方のファイルを開き、でプロジェクト名を手動で編集してpackage.json実行npm installし、でプロジェクト名がどのように変化するかを確認しpackage-lock.jsonます。licenseに記録されていないようですpackage-lock.json
zumafra

2
やったときに@zumafraパッケージlock.jsonファイルが使用されますnpm cinpm installちょうどロックファイルが提供されていても、package.jsonを使用します

13

package-lock.json「バージョン」プロパティなどのプロパティの数値、または依存関係プロパティがで変更されたときに書き込まれpackage.jsonます。

これらの数値でいる場合package.jsonpackage-lock.json一致し、package-lock.jsonから読み込まれます。

これらの数値でいる場合package.jsonpackage-lock.json一致しない場合は、package-lock.jsonそれらが存在する場合、これらの新しい値、および、そのようなキャレットやチルダなどの新しい修飾子とに書き込まれます。しかし、への変更を引き起こしているのは数字ですpackage-lock.json

意味を確認するには、次のようにします。package.jsonなしpackage-lock.jsonで使用し、次で実行npm install

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "7.2.2"
  }
}

package-lock.json 今持っているでしょう:

"sinon": {
  "version": "7.2.2",

次に、両方のファイルを新しいディレクトリにコピーして貼り付けます。package.json(キャレットの追加のみ)に変更します。

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.2.2"
  }
}

実行しますnpm installpackage-lock.jsonファイルがない場合、sinon @ 7.3.0がインストールされます。npm installからの読み取り package-lock.jsonおよび7.2.2をインストールします。

次に変更package.json

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.3.0"
  }
}

実行しますnpm installpackage-lock.jsonはに書き込まれ、次のように表示されます。

"sinon": {
  "version": "^7.3.0",

7

同様に言及すべき重要なことの1つは、パッケージロックファイルに伴うセキュリティの向上です。誰かがパブリックnpmレジストリを改ざんし、パッケージ自体のバージョンを変更することなくパッケージのソースコードを変更した場合、パッケージのすべてのハッシュを保持するため、パッケージロックファイルによって検出されます。


4

package-lock.jsonは、npmがnode_modulesツリーまたはpackage.jsonを変更する操作に対して自動的に生成されます。中間の依存関係の更新に関係なく、後続のインストールで同一のツリーを生成できるように、生成された正確なツリーについて説明します。

チームメイト、デプロイメント、継続的インテグレーションがまったく同じ依存関係を確実にインストールするように、依存関係ツリーの単一の表現を記述します。これには、次のプロパティが含まれています。

    {
"name": "mobileapp",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@angular-devkit/architect": {
  "version": "0.11.4",
  "resolved": "https://registry.npmjs.org/@angular- devkit/architect/-/architect-0.11.4.tgz",
  "integrity": "sha512-2zi6S9tPlk52vyqNFg==",
  "dev": true,
  "requires": {
    "@angular-devkit/core": "7.1.4",
    "rxjs": "6.3.3"
  }
},

}


2

このファイルはnpmによって自動的に作成および使用され、パッケージのインストールを追跡し、プロジェクトの依存関係の状態と履歴をより適切に管理します。このファイルの内容は変更しないでください。


1
このファイルとの競合が発生した場合はどうなりますか?
Oliver Watkins

0

package-lock.json:アプリケーションに現在インストールされている正確なバージョンの詳細が含まれています。


1
こんにちは、ようこそ。この質問はすでに回答されています。質問の前に緑色のチェックがあるかどうかを確認して、質問が回答済みとしてマークされているかどうかを確認する必要があります。
Nestor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.