web-dev-qa-db-ja.com

yarn.lockファイルとpackage-lock.jsonファイルをコミットする必要がありますか?

確定的pkgのインストールにはすべてヤーンを使用していますが、ユーザーがnpmを使用するのを妨げることはありません - これらのファイルを両方とも持つと問題が発生すると思います。 1つはあなたの.gitignoreディレクトリに追加されるべきですか?

91
Artimus

一般に依存関係ロックファイルを常にコミットする

現状のままで カバー 他の場所では、多くのパッケージ管理システム(例: composerbundler )でサポートされている依存関係ロックファイルは、そのプロジェクトを実行しようとしている各個人が正確に依存関係のテストされたセットでそうしているように。

ロックファイルを常に他のプロジェクトに含めることを意図したパッケージにコミットする必要があるかどうかは明確ではありません(より緩い依存関係が望ましい場合)。ただし、 Yarn とNPM(@Cyrilleでカバー)は、必要に応じてそれぞれyarn.lockpackage-lock.jsonをインテリジェントに無視します。これらのロックファイルを常にコミットしても安全です。

ですから、どのパッケージマネージャを使っているかに応じて、常にyarn.lockまたはpackage-lock.jsonのうち少なくとも1つをコミットするべきです。

Yarn.lockとpackage-lock.jsonの両方をコミットするべきですか?

現在2つの異なるパッケージ管理システムがあります。どちらもpackage.jsonから依存関係の同じセットをインストールしますが、2つの異なるロックファイルから生成および読み取りを行います。 NPM 5はpackage-lock.jsonを生成しますが、Yarnはyarn.lockを生成します。

package-lock.jsonをコミットすると、NPM 5を使用して依存関係をインストールする人々のためのサポートを構築することになります。yarn.lockをコミットすると、Yarnと依存関係をインストールする人々のためのサポートを構築することになります。

yarn.lockまたはpackage-lock.json、あるいはその両方をコミットすることを選択するかどうかは、プロジェクトで開発している人がYarnまたはNPM 5あるいはその両方を使用しているかどうかによって異なります。あなたのプロジェクトがオープンソースであるならば、するべき最もコミュニティにやさしいことはおそらく両方をコミットし、yarn.lockpackage-lock.jsonが常に同期を保つことを確実にするために自動化されたプロセスを持つことでしょう。

更新:糸が導入されました importコマンドyarn.lockファイルからpackage-lock.jsonファイルを生成します。これは、2つのファイルを同期させるのに役立ちます。 (ありがとう@weakish)


この問題は、Yarnプロジェクトで次のように詳細に議論されました。

両方とも閉鎖中です。

102
Robin Winslow

1つの依存関係ツリーロックファイルをコミットする必要がありますが、両方をコミットしないでください。これはまた、プロジェクトをビルドして開発するために、ヤーンまたはnpm(両方ではない)のどちらかに標準化することを必要とします。

これは、あなたが糸で標準化しているのなら、なぜyarn.lockがコミットされるべきなのかについての糸の記事です。

yarn.lockファイルとpackage-lock.jsonファイルの両方をコミットした場合、2つのファイルが異なる依存関係ツリーを提供できる方法はたくさんあります(ヤーンのアルゴリズムとnpmのツリー解決アルゴリズムが同一であっても)。まったく同じ答えです。些細なことではないので、両方のファイルで同じ依存関係ツリーが維持されることはまずありません。また、作成がyarnとnpmのどちらを使用して行われたかによって動作が異なることは望ましくありません。

Yarnがyarn.lockの使用からpackage-lock.jsonissue here )に切り替わった場合、コミットするロックファイルの選択が簡単になります。また、yarnとnpmが異なるビルドになることを心配する必要がなくなりました。 このブログ投稿に基づく 、これは近いうちには起こらないはずの変更です(ブログ投稿にはyarn.lockpackage-lock.jsonの違いも記載されています)。

16
crimbo

私は同じ質問について考えていました。これが私の考えです。

npm package-lock.jsonドキュメント は次のように言っています。

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

これは「自分のマシン上で動作する」効果を防止するので素晴らしいです。

このファイルがないと、npm install --save Aの場合、npmは"A": "^1.2.3"package.jsonに追加します。他の誰かがあなたのプロジェクトでnpm installを実行するとき、Aのバージョン1.2.4がリリースされた可能性があります。これはあなたのpackage.jsonで指定されたsemver範囲を満たす最新の利用可能なバージョンなので、このバージョンをインストールします。しかし、このバージョンで新しいバグが導入された場合はどうなりますか?この人は、あなたが以前のバージョンを持っているので、あなたが再現することができないという問題を持つでしょう、どんなバグもなしで。

node_modulesディレクトリの状態を修正することで、package-lock.jsonファイルはこの問題を防ぎます。なぜなら、誰もがすべてのパッケージの同じバージョンを持っているからです。

しかし、npmモジュールを書いて公開しているとしたらどうでしょうか。ドキュメントには次のように書かれています。

Package-lock.jsonに関する1つの重要な詳細は、公開できないということです。トップレベルパッケージ以外の場所で見つかると無視されます。

そのため、コミットしても、ユーザーがモジュールをインストールすると、package-lock.jsonファイルは取得されず、package.jsonファイルのみが取得されます。それでnpmはあなたのすべての依存関係の意味範囲を満たす最新バージョンをインストールします。つまり、モジュールを書き始めたときにインストールしたモジュールではなく、常に依存関係のこれらのバージョンを使ってモジュールをテストしたいということです。したがって、その場合、package-lock.jsonは明らかに無用です。もっと、それはいらいらすることができます。

6
Cyrille

これが私の経験則です。アプリケーションを使用している場合は、ロックファイルをコミットします。ライブラリを管理している場合は、無視リストに追加してください。どちらの方法でもpackage.jsonで正確なsemverの範囲を使うべきです。 Yehuda KatzキャッシュされたGemfile.lockをコミットするタイミングについての素晴らしい説明を書いています(Rubyのロックファイル)そしてそうでない時。少なくともtl; drセクシ​​ョンを読んでください。

4
ravinggenius

これらのファイルはツールによって管理されるため、糸を使用するとpackage-lock.jsonが効果的に更新されると想定すると、両方のファイルのコミットが正常に機能すると考えられます。

ユーザーにとって最も重要なのはpackage-lock.json(たとえば、糸を使用しない)であるため、このhasはコミット。

yarn.lockの場合、単独で作業するかチームで作業するかによって異なります。ソロの場合、コミットする必要はないと思います。チームで作業する(計画している)場合は、少なくとも糸 サポートする ????までコミットする必要があります。

ヤーンチームは最終的にyarn.lockの使用をやめ、代わりにpackage-json.lockを使用すると思われますが、この時点でよりシンプルになりますか????

2
dohzya

あなたは正しいです! npmyarnの両方を使用できるようにすると、問題が発生します。 この記事 を見てください。

現在、同じリポジトリでyarnnpmの両方を使用してパッケージをインストールするユーザーに警告を追加することを計画しています。

将来の混乱や起こりうる一貫性の問題を避けるためにyarnを使うことにした場合はpackage-lock.jsonファイルを削除することを強くお勧めします。

あなたはnpmyarnの両方をあなたのパッケージマネージャとして使いたくないかもしれません。

1
BinaryJoe01

いいえ。両方のロックファイルを同時に使用すると、特にチームで共同作業をするときに、依存関係ツリーに矛盾が生じることがよくあります。どちらか一方のロックを無視することは簡単な解決策です。チームがこの変更を理解し同意するようにしてください。

0