В чем разница между "npm install" и "npm ci"?

Я работаю с непрерывной интеграцией и обнаружил команду npm ci.

Я не могу понять, каковы преимущества использования этой команды для моего рабочего процесса.

Это быстрее? Это делает тест более сложным, хорошо, и после?

Ответ 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

Ответ 2

npm ci удалит любую существующую папку node_modules и использует файл package.lock для установки конкретной версии каждого пакета. Это значительно быстрее, чем установка npm, потому что пропускает некоторые функции. Это чистая установка состояния отлично подходит для конвейеров ci/cd и сборок докеров! Вы также используете его для установки всего сразу, а не конкретных пакетов.

Ответ 3

Связанная с документацией сводка:

Короче говоря, основные различия между использованием npm install и npm ci:

  • Проект должен иметь существующий пакет-lock.json или npm-shrinkwrap.json.
  • Если зависимости в блокировке пакета не совпадают с зависимостями в пакете. Json, npm ci выйдет с ошибкой, вместо обновления блокировки пакета.
  • npm ci может устанавливать только целые проекты за раз: отдельные зависимости не могут быть добавлены с помощью этой команды.
  • Если node_modules уже присутствует, он будет автоматически удален до запуска npm ci.
  • Он никогда не будет писать в package.json или любой из пакетов-блокировок: установки по существу заморожены.