1. ホーム
  2. npm

[解決済み] npm install」と「npm ci」の違いは何ですか?

2022-03-22 01:43:45

質問

継続的インテグレーションで作業しているのですが、その際に npm ci コマンドを使用します。

このコマンドを使うことで、私のワークフローにどのような利点があるのかがわからないのです。

速くなるのか? テストが難しくなるのか、大丈夫なのか、後なのか。

解き方は?

からの npmドキュメント :

要するに、npm installとnpm ciを使う場合の主な違いです。

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

本来は。 npm install は読みます。 package.json を使用して依存関係のリストを作成し package-lock.json を使って、どのバージョンの依存関係をインストールするかを通知します。 依存関係が package-lock.json で追加されます。 npm install .

npm ci (にちなんで C 連続 I ntegration) から直接依存関係をインストールします。 package-lock.json を使用し package.json は、バージョンの不一致がないことを確認するためだけに使用されます。 依存関係が欠けていたり、互換性のないバージョンを持っている場合は、エラーになります。 .

使用方法 npm install を使用すると、新しい依存関係を追加したり、プロジェクトの依存関係を更新したりすることができます。通常は、開発中に依存関係のリストを更新するような変更を加えた後に使うことになるでしょうが npm ci この場合

使用方法 npm ci 決定論的で反復可能なビルドが必要な場合。例えば、継続的インテグレーションや自動化されたジョブなど、また依存関係を初めてインストールする場合、代わりに npm install .

npm install

  • パッケージとその依存関係をすべてインストールします。
  • 依存関係は npm-shrinkwrap.jsonpackage-lock.json (の順に)。
  • 引数なし : ローカルモジュールの依存関係をインストールします。
  • グローバルパッケージのインストールが可能です。
  • で不足している依存関係をインストールします。 node_modules .
  • に書き込むことができる。 package.json または package-lock.json .
    • 引数で使用する場合( npm i packagename に書き込むことができます。 package.json を使用して、依存関係を追加または更新します。
    • を引数なしで使用した場合、( npm i に書き込むことができます。 package-lock.json を使用して、依存関係がこのファイルにまだない場合は、そのバージョンをロックダウンします。

npm ci

  • 少なくともnpmが必要 v5.7.1 .
  • 必要なもの package-lock.json または npm-shrinkwrap.json が存在することを示します。
  • 以下の2つのファイルの依存関係が一致しない場合、エラーをスローします。 package.json .
  • 削除 node_modules をインストールし すべての依存関係 を一度に実行します。
  • に書き込むことはありません。 package.json または package-lock.json .

アルゴリズム

一方 npm ci から依存関係ツリー全体を生成します。 package-lock.json または npm-shrinkwrap.json , npm install の内容を更新します。 node_modules を以下のアルゴリズムで実行します ( ソース ):

load the existing node_modules tree from disk
clone the tree
fetch the package.json and assorted metadata and add it to the clone
walk the clone and add any missing dependencies
  dependencies will be added as close to the top as is possible
  without breaking any other modules
compare the original tree with the cloned tree and make a list of
actions to take to convert one to the other
execute all of the actions, deepest first
  kinds of actions are install, update, remove and move