npm 5で作成されたpackage-lock.jsonファイルをコミットしますか?


1395

npm 5が本日リリースされ、新機能の1 つにはpackage-lock.jsonファイルの作成による確定的なインストールが含まれます。

このファイルはソース管理に保持されることになっていますか?

私はそれがyarn.lockand composer.lockに似ていると想定していますが、どちらもソース管理に保持されることになっています。


20
短い答え:はい。1つのコメント:package-lock.jsonが変更されると、他のソースの変更とは別に、その変更のみのコミットを作成できます。これによりgit log、対処が容易になります。
パープルジャケット2017

14
ファイルが存在しない場合、確定的なインストールを作成するのに役立ちません。
アランH.

4
プロジェクトによって異なります。github.com/npm/npm/issues/20603
Gajus

3
npmが本当に信頼できる場合、その目的は、プロジェクトが使用しているものをより明確に報告することです。予測可能性が本当に必要な場合は、このファイルを無視して、代わりにnode_modulesをインストールし(answers +コメントの.npmrcおよび関連する構成を参照)、パッケージマネージャーが実行している状態ではなく、実際に何が変化しているかを追跡します。結局のところ、どちらがより重要ですか?パッケージマネージャーまたは使用しているコード。
ジムモント2018年

回答:


1616

はい、package-lock.jsonソース管理にチェックインすることを目的としています。npm 5を使用している場合は、コマンドラインに次のようcreated a lockfile as package-lock.json. You should commit this file.に表示されることがありnpm help package-lock.jsonます。

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

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

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

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

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

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

主要な詳細の1つpackage-lock.jsonは公開できないことであり、トップレベルパッケージ以外の場所で見つかった場合は無視されます。それはnpm-shrinkwrap.json(5)とフォーマットを共有します。これは基本的に同じファイルですが、公開を許可します。これは、CLIツールをデプロイするか、本番パッケージを作成するための公開プロセスを使用しない限り、お勧めできません。

両方の場合package-lock.jsonnpm-shrinkwrap.jsonパッケージのルートに存在している、package-lock.json完全に無視されます。


77
実際にファイルをコミットするとどのようなプロジェクトで役に立ちますか?semverとpackage.jsonの要点は、更新された互換性のある依存関係に注意する必要がないことです。
curiousdannii

45
キーワードは「する必要はない」ですが、実際にはサーバーを完全にフォローするわけではありません。そのため、package-lock.jsonとpackage.jsonを一緒に使用してパッケージを簡単に更新できますが、すべての開発者とすべてのデプロイ済みアプリケーションが同じ依存関係ツリーを使用していることを確認してください。
Panu Horsmalahti 2017年

34
@trusktr:Sindre Sorhus は、「アプリにはロックファイルを使用するが、パッケージには使用しないことを推奨しています。
vine77 2017年

23
もう1つは、package-lock.jsonはNPMでの公開では無視されるため、開発者がライブラリ開発にそれを使用する場合、更新された依存関係バージョンからのリグレッションをキャッチして、それを渡す可能性を最小限に抑えますエンドユーザーへのバグ。このため、ライブラリdevにロックファイルを使用しないと、バグの出荷数が減ります。
trusktr 2017

128
個人的に私は今package-lock.json、私に追加することに頼らなければ.gitignoreなりませんでした...それはそれらを解決するよりもはるかに多くの問題を引き起こしていました。マージまたはリベースすると常に競合します。マージの結果package-lock.json、CIサーバーで破損が発生した場合は、修正を続ける必要があるだけです。
Stefan Z Camilleri 2017

111

はい、チェックインすることを目的としています。独自のコミットを取得することをお勧めします。これにより、差分に多くのノイズが追加されることがわかります。


19
ソースコードリポジトリにチェックインする必要があるかどうかを議論するのは公平ですが、このファイルをnpmに公開することは実際には議論の対象ではありません。package-lock.jsonまたはshrinkwrapファイルをnpmレジストリに含める必要があります。そうしないと、公開されたパッケージは、第1世代の依存関係の依存関係の固定されていない変更の影響を受けます。これらの第2世代以降の依存関係の1つが重大な変更を公開し、公開されたパッケージが不可解に破損するまで、これが問題であることに気付くことはありません。このpackage-lock.jsonファイルは、その問題を解決するために作成されました。
ゲリラ

9
ノイズによる@BetoAveigaつまり、package-lock.jsonを使用したコミットでは、ノードパッケージバージョンの行が非常に多くなり、そのコミットの他の作業が非表示になる可能性があります。
xer0x 2017年

7
私は通常、パッケージのインストールを他の作業とは別にしています。「Installed chai and mocha」のようなコミットをdiffする必要はありません。何が変更されたかはすでに知っているからです。
キース

3
package-lock.jsonトランクとブランチのあるSCMシステムで作業するときのファイルに関するアドバイスはありますか?トランクにマージする必要があるブランチに変更を加えています... 2つのpackage-lock.jsonファイル間の競合を(どういうわけか)解決する必要がありますか?これは痛いです。
kmiklas

3
@guerillapresident私が理解しているように、あなたは部分的に正しいです。このファイルをnpmに公開することは議論の余地がありません。公開することはできません。
Tim Gautier、

66

はい、あなたはすべきです:

  1. をコミットしpackage-lock.jsonます。
  2. npm cinpm installCIとローカル開発マシンの両方でアプリケーションをビルドするときの代わりに使用する

npm ciワークフローが必要との存在をpackage-lock.json


npm installコマンドの大きな欠点は、予期しない動作であり、それがを変更する可能性がpackage-lock.jsonあるのに対しnpm ci、ロックファイルで指定されたバージョンのみを使用してエラーを生成することです。

  • package-lock.jsonpackage.jsonが同期していない場合
  • package-lock.jsonが欠落している場合。

したがって、npm installローカルで実行されます。複数の開発者がいる大規模なチームでpackage-lock.jsonは、package-lock.json代わりに完全に削除することを決定するために、開発者内で多くの競合が発生する可能性があります。

しかし、プロジェクトの依存関係がさまざまなマシン間で信頼できる方法で繰り返し解決されると信頼できる強力なユースケースがあります。

package-lock.jsonあなたからそれを正確に得る:既知の作業状態。

以前は、ランダムな依存関係が破壊的な更新を取得したために、いつかビルドが失敗するpackage-lock.json/ npm-shrinkwrap.json/ yarn.lockファイルのないプロジェクトがありました。

最後に機能するバージョンを推測する必要がある場合があるため、これらの問題は解決が困難です。

新しい依存関係を追加する場合でも、を実行しnpm install {dependency}ます。アップグレードする場合は、npm update {dependency}またはnpm install ${dependendency}@{version}を使用して、変更されたをコミットしpackage-lock.jsonます。

アップグレードが失敗した場合は、最新の既知の動作に戻すことができますpackage-lock.json


npm doc引用するに

生成されたパッケージロックをソース管理にコミットすることを強くお勧めします。これにより、チームの他の誰でも、デプロイメント、CI /継続的インテグレーション、パッケージソースでnpm installを実行する誰でも、まったく同じ依存関係ツリーを取得できます。あなたが開発していたこと。さらに、これらの変更の差分は人間が読める形式であり、npmがnode_modulesに加えた変更を通知します。そのため、推移的な依存関係が更新されたり、巻き上げられたりしたかどうかを確認できます。

vs違いnpm cinpm installに関して:

  • プロジェクトには、既存のpackage-lock.jsonまたはnpm-shrinkwrap.jsonが必要です。
  • パッケージロックの依存関係がpackage.jsonの依存関係と一致しない場合、 npm ciを更新する代わりにエラーで終了します。
  • npm ci 一度にインストールできるのはプロジェクト全体のみです。このコマンドを使用して個々の依存関係を追加することはできません。
  • node_modulesが既に存在する場合npm ciは、インストールを開始する前に自動的に削除されます。
  • package.jsonパッケージロックやパッケージロックへの書き込みは行われません。インストールは基本的にフリーズされます。

注:私はここに同様の答えを投稿しました


10
この答えは、特にnpm ciを使用して、より多くの信用に値します。これを使用すると、パッケージロックで発生する問題のほとんどが軽減されます。
JamesB

package.jsonの固定バージョン(キャレットやチルドなし)を使用する方がはるかにクリーンなオプションであることがわかりました。これは私をwhose build would fail one day because a random dependency got a breaking updateある種の問題から救います。それは同じ問題を引き起こす子供の依存の可能性を残しますが。
アシュワニアガルワル

58

はい、チェックインすることをお勧めします(はい、チェックイン)

差分を見たときに多くのノイズや競合が発生することに同意します。しかし、利点は次のとおりです。

  1. すべてのパッケージのまったく同じバージョンを保証します。この部分は、異なる環境で異なる時間にビルドする場合に最も重要です。で使用することもでき^1.2.3ますがpackage.jsonnpm install開発マシンとビルドサーバー、特に間接依存パッケージで同じバージョンを毎回確実に取得するにはどうすればよいですか?まあ、それpackage-lock.jsonを保証します。(npm ciロックファイルに基づいてパッケージをインストールする助けを借りて)
  2. インストールプロセスが改善されます。
  3. 新しい監査機能に役立ちますnpm audit fix(監査機能はnpmバージョン6からのものだと思います)。

3
私の知る限り、semver(npm開発者はとにかく理解できない)を使用しないと、少なくとも99%の場合にロックファイルがあるのと同じ動作をするはずです。私自身の経験では、主に一次パッケージ(直接の依存関係、無愛想なjqueryの日付ピッカーなど)で、いくつかの干渉が発生します。私のnpmの個人的な経験では、ロックファイルは永遠にノイズでした。この知恵が最近のバージョンで変更されていないことを願っています。
Svend

13
言及のための1 npm ci。人々package-lock.jsonはパッケージの決定的なインストールを許可することを頻繁に言及しますが、この動作を容易にするコマンドについてはほとんど言及しません!多くの人はおそらくnpm install、ロックファイルの内容を正確にインストールすると誤って想定しています...
ahaurat

npm ciはnpm 5にはありません
。– dpurrington

ありがとうございました!を使用してnpm ciいる場合にのみ、package-lock.jsonをコミットすることは意味があります。チーム/リード開発者は、いつ更新するかを決定できます。誰もが勝手にそれをコミットしている場合、それは無意味であり、それはあなたのリポジトリにノイズを作成しているだけです。NPMのドキュメントでは、これをより明確にする必要があります。ほとんどの開発者は、この機能に戸惑っていると思います。
adampasz

@adampasz実際には各開発者がロックファイルをコミットでき、テストに合格してマージされた後、パッケージが変更された場合、2番目のブランチはロックファイルを更新するだけです(package.jsonを頻繁に変更しないため、この問題にあまり直面しません(
Xin

38

私のプロジェクトではこのファイルをコミットしません。ポイントは何ですか ?

  1. 生成されます
  2. gitlab-ci.ymlビルドを使用したgitlabでのSHA1コード整合性エラーの原因です

私はそれについて悪い経験をしたので、libsのpackage.jsonで^を決して使用しないことは事実です。


11
これがnpm docs内からさらに詳しく説明されればいいのに-コミットしないことによって具体的に失う内容の概要を知っておくと役立ちますpackage-lock.json。一部のリポジトリは、それを持っていることから得られる利点を必要としない場合があり、ソースに自動生成されたコンテンツがないことを好む場合があります。
PotatoFarmer 2018年

2
問題の解決に役立つデバッグ(2つのロック間の差分など)にどのように役立つかがわかります。このようなことを防ぐためにも使用できると思いますが、それが原因でマージ競合が発生する可能性のある共有リポジトリでそれを使用するのは面倒な場合もあります。手始めに、私は物事をシンプルに保ちたいのですが、package-lock.jsonが本当に必要になるまで、package.jsonをそのまま使用します。
radtek、

6
あなたはpackage.jsonで^を使用しないかもしれませんが、あなたの依存関係がそれを使用しないことを確信できますか?
ネイカー

35

git diffを実行するときのノイズについて不平を言う人々に:

git diff -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'

私がしたことはエイリアスを使用することでした:

alias gd="git diff --ignore-all-space --ignore-space-at-eol --ignore-space-change --ignore-blank-lines -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'"

リポジトリ全体(それを使用するすべての人)のdiffにあるpackage-lock.jsonを無視するには、これをに追加し.gitattributesます。

package-lock.json binary
yarn.lock binary

これにより、「バイナリファイルa / package-lock.jsonとb / package-lock.jsonは、パッケージロックファイルが変更されるたびに異なります。さらに、一部のGitサービス(特にGitLabではなくGitHub)も除外されます。これを行うときにオンラインで表示すると、差分からこれらのファイル(変更された10k行はありません!)


1
私が持っているgd() { git diff --color-words $1 $2 -- :!/yarn.lock :!/package-lock.json; }私の.bashrcの代わりに、別名に。
apostl3pol

16

はい、このファイルをコミットできます。NPMの公式ドキュメント

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

このファイルは、ソースリポジトリにコミットすることを目的としています[。]


13
インストールは常にnode_modulesを更新しないので、package-lock.jsonを更新しますか?
Tim Gautier

2
いいえ、実行npm ciしてpackage-lock.jsonからインストールできます
William Hampshire

リポジトリにpackage-lock.jsonがある場合は継続的インテグレーションビルドでnpm ciを使用する必要があるという回答を強調する必要があります
MagicLAMP

6

package-lock.jsonをグローバルに無効化

端末に次のように入力します。

npm config set package-lock false

これは本当に魔法のように私のために働く


2
これは~/.npmrc(少なくとも私のmacosで)コンテンツを作成package-lock=falseし、同じことを特定のプロジェクトnode_modules/(例echo 'package-lock=false' >> .npmrc
jimmont

6
これがネガティブになるのは、私にとってはおもしろいことです。npmコミュニティは、package-lock.jsonの自動生成がコミュニティの関与が悪かったことを受け入れられません。チームのプロセスに影響を与えるようなことはすべきではありません。強制ではなく、有効にするためのオプションである必要があります。「git add *」を実行し、それに気付かずにビルドを台無しにしてしまう人の数。あなたが何らかのマージベースのフローを持っているなら、私はgitフローがそれを使用する人々にとって聖書のようなものであることを知っています、これはうまくいきません。マージ時に世代を持つことはできません!npmバージョン管理が壊れています。パッケージ:1.0.0は確定的でなければなりません!
エリックTwilegar

3
なぜこれは反対投票ですか?これは明らかに、機能しない機能を無効にする正当な方法です。そして、それ自体は質問に答えませんが、それは質問を台無しにします。つまり、もはや答える必要はありません。私からのいいね:)
Superole

反対票が出ているのは、単に機能を無効にしているためです。
ラザ

5

はい、package-lock.jsonをコミットするのは標準的な方法です

package-lock.jsonをコミットする主な理由は、プロジェクトの全員が同じパッケージバージョンを使用しているためです。

長所:-

  • 厳密なバージョン管理に従い、メジャーバージョンへの更新を自動的に許可しない場合、サードパーティパッケージの下位互換性のない変更からパッケージロックをコミットすることで、多くの助けになります。
  • 特定のパッケージを更新した場合、package-lock.jsonで更新され、リポジトリを使用するすべてのユーザーが変更をプルすると、その特定のバージョンに更新されます。

短所:-

  • それはあなたのプルリクエストを醜く見せることができます:) '

編集:-npm installは、プロジェクト内の全員が同じパッケージバージョンにあることを確認しません。npm ciはこれに役立ちます。


4
npm ci代わりに使用する場合、短所はなくなりnpm installます。
k0pernikus

2
スコープは少し忍び寄っていますが、ここでは@ k0pernikusからのその優れたアドバイスについて詳しく説明します。
ラフィン

1
「プロジェクトの全員が同じパッケージバージョンになります。行う必要があるのはnpm installだけです」そうではありません。代わりに「npm ci」を使用する必要があります
reggaeguitar

ありがとう、@ reggaeguitar。これに対する私の答えを更新します。
Nikhil Mohadikar

2

私のnpmの使用は、縮小化/醜化されたcss / jsを生成し、djangoアプリケーションが提供するページで必要なJavaScriptを生成することです。私のアプリケーションでは、JavaScriptがページ上で実行されてアニメーションを作成し、時にはAjax呼び出しを実行し、VUEフレームワーク内で動作し、CSSで動作します。package-lock.jsonがpackage.jsonの内容をオーバーライドする制御を持っている場合、このファイルの1つのバージョンが必要になる場合があります。私の経験では、npm installによってインストールされる内容に影響を与えないか、影響を与える場合でも、私が知っている限り、私が展開するアプリケーションに悪影響を与えていません。mongodbや、従来のシンクライアントである他のアプリケーションは使用しません。

npm installがこのファイルを生成し、npm installがアプリを実行する各サーバーのデプロイプロセスの一部であるため、package-lock.jsonをリポジトリから削除します。ノードとnpmのバージョン管理は各サーバーで手動で行われますが、同じになるように注意しています。

場合はnpm install、サーバー上で実行され、それがパッケージlock.jsonを変更し、サーバ上のレポで記録されたファイルに変更がある場合は、次の展開では、原点からの新しい変更をプルすることを可能に文句を言いません。つまり、プルはpackage-lock.jsonに加えられた変更を上書きするため、デプロイできません。

ローカルで生成されたpackage-lock.jsonをリポジトリの内容(ハードオリジンマスターのリセット)で上書きすることもできません。package-lock.jsonが内容を反映していない場合にコマンドを発行すると、npmが文句を言うからです。 npmインストールが原因でnode_modulesが発生し、デプロイが中断されます。これがnode_modulesにわずかに異なるバージョンがインストールされていることを示している場合は、問題が発生することはありません。

node_modulesがリポジトリ上にない場合(および存在しない場合)、package-lock.jsonは無視する必要があります。

何か不足している場合は、コメントで訂正してください。ただし、このファイルからバージョン管理が行われているという点は意味がありません。ファイルpackage.jsonにはバージョン番号が含まれており、このファイルはnpm installが発生したときにパッケージをビルドするために使用されるファイルであると想定しています。

jason@localhost:introcart_wagtail$ rm package.json
jason@localhost:introcart_wagtail$ npm install
npm WARN saveError ENOENT: no such file or directory, open '/home/jason/webapps/introcart_devtools/introcart_wagtail/package.json'

ビルドは失敗しますが、node_modulesをインストールしたり、js / cssをビルドするためにnpmを適用したりしても、package-lock.jsonを削除しても問題はありません

jason@localhost:introcart_wagtail$ rm package-lock.json 
jason@localhost:introcart_wagtail$ npm run dev

> introcart@1.0.0 dev /home/jason/webapps/introcart_devtools/introcart_wagtail
> NODE_ENV=development webpack --progress --colors --watch --mode=development

 10% building 0/1 modules 1 active ...

追加するだけで、package-lock.jsonをリポジトリにコミットし、ansibleデプロイでnpm ciを使用しています。これは、削除のnode_modulesであると考えており、更新せずにすべてをpackage-lock.jsonにインストールします。これにより、私のフロントエンドの人は、デプロイで手動の介入を必要とせずにJavaScriptのものをアップグレードできます。
MagicLAMP
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.