回答:
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 ci
(C ontinuous I ntegrationにちなんで名付けられました)は、依存関係を直接インストールし、不一致のバージョンがないことを検証するためにのみpackage-lock.json
使用しpackage.json
ます。依存関係がないか、バージョンに互換性がない場合、エラーがスローされます。
npm install
新しい依存関係を追加したり、プロジェクトの依存関係を更新したりするために使用します。通常、依存関係のリストを更新する変更をプルした後、開発中に使用npm ci
しますが、この場合に使用することをお勧めします。
npm ci
確定的で再現可能なビルドが必要な場合に使用します。たとえば、継続的な統合、自動化されたジョブなどの間、および依存関係を初めてインストールするときnpm install
。
npm install
npm-shrinkwrap.json
and によってpackage-lock.json
(この順序で)駆動されます。node_modules
ます。package.json
またはに書き込みpackage-lock.json
ます。
npm i packagename
)と共に使用するとpackage.json
、依存関係を追加または更新するために書き込む場合があります。npm i
)package-lock.json
一部の依存関係がまだこのファイルにない場合、依存関係のバージョンをロックダウンするように書き込むことがあります。npm ci
package-lock.json
またはnpm-shrinkwrap.json
存在する必要があります。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
npm install package
package-lock.json
との 両方を変更できますがpackage.json
、npm install
引数は変更されるだけですpackage-lock.json
npm ci
既存のnode_modulesフォルダーを削除し、そのpackage-lock.json
ファイルを使用して各パッケージの特定のバージョンをインストールします。一部の機能をスキップするため、npmインストールよりも大幅に高速です。クリーンな状態でのインストールは、ci / cdパイプラインとDockerビルドに最適です!また、特定のパッケージではなく、すべてを一度にインストールするためにも使用します。
リンクしたドキュメントには要約があります:
つまり、npm installとnpm ciの主な違いは次のとおりです。
- プロジェクトには、既存のpackage-lock.jsonまたはnpm-shrinkwrap.jsonが必要です。
- パッケージロックの依存関係がpackage.jsonの依存関係と一致しない場合、npm ciはパッケージロックを更新する代わりにエラーで終了します。
- npm ciは一度にプロジェクト全体しかインストールできません。このコマンドで個々の依存関係を追加することはできません。
- node_modulesがすでに存在する場合は、npm ciがインストールを開始する前に自動的に削除されます。
- package.jsonやパッケージロックのいずれにも書き込まれません。インストールは基本的にフリーズされます。
コマンドの機能は非常に似ていますが、package.json
とpackage-lock.json
ファイルで指定された依存関係をインストールするためのアプローチに違いがあります。
npm ci
アプリのすべての依存関係のクリーンインストールを実行しnpm install
ますが、既にシステムに存在する場合、一部のインストールをスキップすることがあります。システムにすでにインストールされpackage.json
ているバージョンが、意図したものではない場合、つまり、インストールされているバージョンが「必要な」バージョンと異なる場合、問題が発生する可能性があります。
その他の違いはnpm ci
、package*.json
ファイルに触れないことです。依存関係のバージョンがpackage.json
とpackage-lock.json
ファイルで一致しない場合、インストールが停止し、エラーが表示されます。
あなたはここの公式ドキュメントからより良い説明を読むことができます。
また、パッケージロックについてはこちらをご覧ください。
alpineのようなライトノードDockerイメージには、依存関係でnode-gyp
あるPythonがインストールされていないことに注意してくださいnpm ci
。
私はそれがnpm ci
機能するためにはビルドに依存関係としてPythonをインストールする必要があるというのは少し意欲的だと思います。
さまざまな状況で使用する必要があります。
npm install
node_modules
ディレクトリのキャッシュが必要な場合、開発やCIに最適です。いつこれを使うの?これは、他の人が使用するパッケージを作成している場合に実行できます(node_modules
そのようなリリースには含めません)。キャッシングに関しては、ランタイム要件の違いにより再インストールが必要になる可能性があるNode.js
rememberの異なるバージョンをサポートする場合は注意してください。1つのバージョンを使用する場合は、最新のバージョンを使用してください。node_modules
Node.js
LTS
npm ci
本番アプリケーション(他のパッケージでは使用されない最終製品)をテストおよびリリースする場合に使用する必要があります。インストールをできるだけ確定的に行うことが重要です。このインストールには時間がかかりますが、最終的にはアプリケーションの信頼性が向上します(node_modules
そのようなリリースには含まれます)。のLTS
バージョンに固執するNode.js
。
おまけ:どれだけ複雑にしたいかに応じて、それらを組み合わせることができます。の機能ブランチでは、git
をキャッシュしnode_modules
てチームの生産性を向上させ、マージリクエストではマスターブランチを使用しnpm ci
て確定的な結果を得ることができます。
npm install
package.jsonに書き込むことができることを知りませんでした。ここに何が書けるか知っていますか?