1. ホーム
  2. javascript

[解決済み] package-lock.json ファイルは .gitignore に追加する必要がありますか?重複

2022-10-14 14:35:48

質問

プロジェクト上にインストールされている依存関係のバージョンをロックするには、コマンド npm install というファイルを作成します。 package-lock.json . これは Node.js v8.0.0 npm v5.0.0 を追加しました。

にもかかわらず Node.js npm このファイルをコミットすることについての推奨事項、それを行うことを避けるべきであるときに関するいくつかの懸念は、また、オプションです。通常、私たちはプロジェクトでコミットしますが、それにもかかわらず、それは特異な質問です。

をコミットすべきですが package-lock.json ファイルをコミットすべきですが、そうすべきではない特定のケースもあります。たとえば、プロジェクトの依存関係の最新版をテストしたい場合、オプションで package-lock.json.gitignore .

ということで、質問は以下の通りです。

  1. には package-lock.json ファイルを .gitignore ?
  2. 私たちが特に必要とする状況はありますか? しなければならない または は不可 を実行するか?

どのように解決するには?

いや、その package-lock.json べきではない に追加されます。 .gitignore . その代わり、強くお勧めします。

  1. を追加します。 package-lock.json をバージョンコントロールリポジトリに追加してください。
  2. 使用する npm ci の代わりに npm install を使用すると、ローカルおよびデプロイメントパイプラインの両方でアプリケーションをビルドする際に

    (その ci コマンドは [email protected] から利用可能です。もし疑問があれば npm via をアップグレードしてください。

    npm install -g npm .)

の最大の欠点の 1 つは npm install コマンドの最大の欠点は、その予期せぬ動作です。 package-lock.json であるのに対し npm ci はロックファイルのバージョンだけを使用し、もし package-lock.jsonpackage.json がずれている。

また npm ci が必要です。 が存在することが必要です。 package-lock.json の存在を必要とし、それがない場合はエラーを表示します。 プロジェクトの依存関係が異なるマシン間で信頼できる方法で繰り返し解決されることを信頼できるようにするための強力な使用事例があります。

さらに npm ci を丸ごと核攻撃します。 node_modules フォルダ全体を削除し、ローカルの変更ではなく実際の依存関係で作業できるようにします。 npm install .

から package-lock.json からは、まさに「known-to-work」な状態を得ることができます。

過去に私は、プロジェクトに package-lock.json / npm-shrinkwrap.json / yarn.lock ファイルでは、ランダムな依存関係が壊れるような更新をされたために、ある日ビルドが失敗することがあります。(多くのライブラリが semvar バージョン管理ガイドラインを尊重していますが、マイナー アップグレードで壊れないという保証はありません)。

これらの問題は、時々、最後の作業バージョンが何であったかを推測しなければならないので、解決するのが難しいです。

プロジェクトのために最新の依存関係をテストすることに関して。これは npm update はそのためのものであり、開発者によって実行されるべきであり、開発者はローカルでもテストを実行し、問題が発生すればそれを解決し、そして変更された package-lock.json . (アップグレードに失敗した場合は、最後に動作していた package-lock.json .)

さらに、私はすべての依存関係を一度にアップグレードすることはほとんどなく (それもさらなるメンテナンスが必要になるかもしれないので)、 むしろ必要な更新を選びます (たとえば npm update {dependency}npm install {dependency}@2.1.3 ). これが、私がこれを手動メンテナンスのステップと見なすもう一つの理由です。

もし、本当に自動化したいのであれば、そのための仕事を作ることができます。

  • リポジトリをチェックアウトする
  • npm updateを実行します。
  • テストの実行
    • テストに合格したら、コミットしてリポジトリにプッシュする。
    • さもなければ失敗し、手動で解決するよう問題を報告

これは Jenkins などの CI サーバーでホストされるものであり、前述の理由でファイルを .gitignore .


または 引用 npm doc :

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

また との違いについて npm cinpm install :

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