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


214

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

私のワークフローでこのコマンドを使用する利点は何なのかわかりません。

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

回答:


327

npm docsから:

つまり、npm installとnpm ciの主な違いは次のとおりです。

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

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

npm ciC ontinuous I ntegrationにちなんで名付けられました)は、依存関係を直接インストールし、不一致のバージョンがないことを検証するためにのみpackage-lock.json使用しpackage.jsonます。依存関係がないか、バージョンに互換性がない場合、エラーがスローされます

npm install新しい依存関係を追加したり、プロジェクトの依存関係を更新したりするために使用します。通常、依存関係のリストを更新する変更をプルした後、開発中に使用npm ciしますが、この場合に使用することをお勧めします。

npm ci確定的で再現可能なビルドが必要な場合に使用します。たとえば、継続的な統合、自動化されたジョブなどの間、および依存関係を初めてインストールするときnpm install

npm install

  • パッケージとそのすべての依存関係をインストールします。
  • 依存関係はnpm-shrinkwrap.jsonand によってpackage-lock.json(この順序で)駆動されます。
  • 引数なし:ローカルモジュールの依存関係をインストールします。
  • グローバルパッケージをインストールできます。
  • 不足している依存関係をにインストールしnode_modulesます。
  • package.jsonまたはに書き込みpackage-lock.jsonます。
    • 引数(npm i packagename)と共に使用するとpackage.json、依存関係を追加または更新するために書き込む場合があります。
    • 引数なしで使用した場合、(npm ipackage-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.jsonnpm 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

1
npm installpackage.jsonに書き込むことができることを知りませんでした。ここに何が書けるか知っていますか?
Veve

5
まあそれは少し誤解を招くかもしれません...それを使用して依存関係をインストール、更新、または削除すると、package.jsonに書き込まれます。テキストでそれをもっとはっきりさせます、ありがとう!
lucascaro

このアルゴリズムはどこに文書化されていますか?つまり、あなたのソースは何ですか?
Yngvar Kristiansen

1
@YngvarKristiansenそれはnpmドキュメントにあり、参照用に特定のセクションへのリンクを追加しました
lucascaro

4
npm install packagepackage-lock.json との 両方変更できますがpackage.jsonnpm install引数は変更されるだけですpackage-lock.json
ノブオ

20

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


9

リンクしたドキュメントには要約があります:

つまり、npm installとnpm ciの主な違いは次のとおりです。

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

2

コマンドの機能は非常に似ていますが、package.jsonpackage-lock.jsonファイルで指定された依存関係をインストールするためのアプローチに違いがあります。

npm ciアプリのすべての依存関係のクリーンインストールを実行しnpm installますが、既にシステムに存在する場合、一部のインストールをスキップすることがあります。システムにすでにインストールされpackage.jsonているバージョンが、意図したものではない場合、つまり、インストールされているバージョンが「必要な」バージョンと異なる場合、問題が発生する可能性があります。

その他の違いはnpm cipackage*.jsonファイルに触れないことです。依存関係のバージョンがpackage.jsonpackage-lock.jsonファイルで一致しない場合、インストールが停止し、エラーが表示されます。

あなたはここの公式ドキュメントからより良い説明を読むことができます

また、パッケージロックについてはこちらをご覧ください


1

alpineのようなライトノードDockerイメージには、依存関係でnode-gypあるPythonがインストールされていないことに注意してくださいnpm ci

私はそれがnpm ci機能するためにはビルドに依存関係としてPythonをインストールする必要があるというのは少し意欲的だと思います。

詳細はこちらDocker and npm-gyp ERR!よくない


0

他の誰もが技術的な違いに答えましたが、両方を使用する状況については誰も説明していません。

さまざまな状況で使用する必要があります。

npm installnode_modulesディレクトリのキャッシュが必要な場合、開発やCIに最適です。いつこれを使うの?これは、他の人が使用するパッケージを作成している場合に実行できますnode_modulesそのようなリリースには含めません)。キャッシングに関しては、ランタイム要件の違いにより再インストールが必要になる可能性があるNode.jsrememberの異なるバージョンをサポートする場合は注意してください。1つのバージョンを使用する場合は、最新のバージョンを使用してください。node_modulesNode.jsLTS

npm ci本番アプリケーション(他のパッケージでは使用されない最終製品)をテストおよびリリースする場合に使用する必要があります。インストールをできるだけ確定的に行うことが重要です。このインストールには時間がかかりますが、最終的にはアプリケーションの信頼性が向上しますnode_modulesそのようなリリースには含まれます)。のLTSバージョンに固執するNode.js

おまけ:どれだけ複雑にしたいかに応じて、それらを組み合わせることができます。の機能ブランチでは、gitをキャッシュしnode_modulesてチームの生産性を向上させ、マージリクエストではマスターブランチを使用しnpm ciて確定的な結果を得ることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.