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