web-dev-qa-db-ja.com

"npm install"と "npm ci"の違いは何ですか?

私は継続的インテグレーションに取り組んでいて、 npm ci コマンドを発見しました。

私のワークフローにこのコマンドを使用することの利点が何であるか私は理解できません。

速いですか?それはテストを難しく、大丈夫に、そして後にしますか?

71
Webwoman

要約すれば:

npm installpackage.jsonを読んで依存関係のリストを作成し、package-lock.jsonを使ってこれらの依存関係のどのバージョンをインストールするかを通知します。 依存関係がpackage-lock.jsonにない場合は、npm installによって追加されます。

npm ciC ontinuous I ntegrationにちなんで名付けられます) package-lock.jsonpackage.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を削除し、all dependenciesを一度にインストールします。
  • package.jsonpackage-lock.jsonには書き込みません。

アルゴリズム

npm cipackage-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
121
lucascaro

Npm ciは既存のnode_modulesフォルダを削除し、各パッケージの特定のバージョンをインストールするためにpackage.lockファイルに依存します。一部の機能をスキップするため、npm installよりもかなり高速です。クリーンな状態でインストールすると、ci/cdパイプラインやdockerビルドに最適です。特定のパッケージではなく、すべてを一度にインストールするためにも使用します。

8
James Harrison

あなたがリンクした文書は要約を持っていました:

要するに、npm installとnpm ciを使用することの主な違いは次のとおりです。

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