Я работаю с непрерывной интеграцией и обнаружил команду npm ci.
Я не могу понять, каковы преимущества использования этой команды для моего рабочего процесса.
Это быстрее? Это делает тест более сложным, хорошо, и после?
Я работаю с непрерывной интеграцией и обнаружил команду npm ci.
Я не могу понять, каковы преимущества использования этой команды для моего рабочего процесса.
Это быстрее? Это делает тест более сложным, хорошо, и после?
Из документов 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
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
npm ci
удалит любую существующую папку node_modules и использует файл package.lock
для установки конкретной версии каждого пакета. Это значительно быстрее, чем установка npm, потому что пропускает некоторые функции. Это чистая установка состояния отлично подходит для конвейеров ci/cd и сборок докеров! Вы также используете его для установки всего сразу, а не конкретных пакетов.
Связанная с документацией сводка:
Короче говоря, основные различия между использованием npm install и npm ci:
- Проект должен иметь существующий пакет-lock.json или npm-shrinkwrap.json.
- Если зависимости в блокировке пакета не совпадают с зависимостями в пакете. Json, npm ci выйдет с ошибкой, вместо обновления блокировки пакета.
- npm ci может устанавливать только целые проекты за раз: отдельные зависимости не могут быть добавлены с помощью этой команды.
- Если node_modules уже присутствует, он будет автоматически удален до запуска npm ci.
- Он никогда не будет писать в package.json или любой из пакетов-блокировок: установки по существу заморожены.