Из документов npm :
Короче говоря, основные различия между использованием npm install и npm ci:
- Проект должениметь существующий package-lock.json или npm-shrinkwrap.json.
- Если зависимости в блокировке пакета не совпадают с зависимостями в package.json, npm ci завершится с ошибкой, вместо обновления блокировки пакета.
- npm ci может устанавливать только целые проекты за раз: с помощью этой команды нельзя добавить отдельные зависимости.
- Если узел node_modules уже присутствует, он будет автоматически удален до того, как npm ci начнет егоinstall.
- Он никогда не будет писать в package.json или любой из пакетов-блокировок: установки по существу заморожены.
По существу, 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-shrinkwrap.json
и package-lock.json
(в указанном порядке). - без аргументов : устанавливает зависимостилокальный модуль.
- Может устанавливать глобальные пакеты.
- Устанавливает все отсутствующие зависимости в
node_modules
. - . Может записывать в
package.json
или package-lock.json
. - При использовании с аргументом (
npm i packagename
) он может писать в package.json
для добавления или обновления зависимости. - при использовании без аргументов (
npm i
) он может писать вpackage-lock.json
для блокировки версии некоторых зависимостей, если их еще нет в этом файле.
- Требуется не менее npm v5.7.1 .
- Требуется
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