Я работаю с непрерывной интеграцией и обнаружил команду npm ci .
Я не могу понять, каковы преимущества использования этой команды для моего рабочего процесса.
Это быстрее? Это делает тест более сложным, хорошо, и после?
источник
Я работаю с непрерывной интеграцией и обнаружил команду npm ci .
Я не могу понять, каковы преимущества использования этой команды для моего рабочего процесса.
Это быстрее? Это делает тест более сложным, хорошо, и после?
Из документов npm :
Короче говоря, основные различия между использованием npm install и npm ci:
- Проект должен иметь существующий пакет-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
и 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.json. Вы знаете, что здесь можно написать?npm install package
мог изменить и то,package-lock.json
и другоеpackage.json
, в то время какnpm install
аргументы без изменений только изменились быpackage-lock.json
npm ci
удалит любую существующую папку node_modules и используетpackage-lock.json
файл для установки конкретной версии каждого пакета. Это значительно быстрее, чем установка npm, потому что пропускает некоторые функции. Установка в чистом виде отлично подходит для конвейеров ci / cd и сборок докеров! Вы также используете его для установки всего сразу, а не конкретных пакетов.источник
Документация, на которую вы ссылались, содержала резюме:
источник
Команды очень похожи по функциональности, однако разница заключается в подходе, который используется для установки зависимостей, указанных в ваших файлах
package.json
иpackage-lock.json
файлах.npm ci
выполняет чистую установку всех зависимостей вашего приложения, тогда какnpm install
может пропустить некоторые установки, если они уже существуют в системе. Проблема может возникнуть, если версия, уже установленная в системе, не является той, которую выpackage.json
намеревались установить, т.е. установленная версия отличается от « требуемой » версии.Другие отличия заключаются в том, что
npm ci
вашиpackage*.json
файлы никогда не коснутся . Это остановит установку и показать ошибку , если версии зависимостей не совпадают вpackage.json
иpackage-lock.json
файлах.Вы можете прочитать намного лучшее объяснение от официальных документов здесь .
Кроме того, вы можете прочитать о блокировках пакетов здесь .
источник
Стоит иметь в виду, что на изображениях док-станции легких узлов, таких как alpine, не установлен Python, зависимость от
node-gyp
которого используетсяnpm ci
.Я думаю, что это несколько сомнительно, что для того, чтобы
npm ci
работать, вам нужно установить Python в качестве зависимости в вашей сборке.Больше информации здесь Docker и npm - gyp ERR! не в порядке
источник
В то время как все остальные ответили на технические различия, никто не объясняет, в каких ситуациях использовать оба.
Вы должны использовать их в разных ситуациях.
npm install
отлично подходит для разработки и в CI, когда вы хотите кэшироватьnode_modules
каталог. Когда это использовать? Вы можете сделать это, если вы делаете пакет для использования другими людьми (вы НЕ включаетеnode_modules
в такой выпуск) . Что касается кэширования, будьте осторожны, если вы планируете поддерживать разные версииNode.js
запоминания, которые,node_modules
возможно, придется переустанавливать из-за различий междуNode.js
требованиями времени выполнения. Если вы хотите придерживаться одной версии, придерживайтесь последнейLTS
.npm ci
следует использовать, когда вы хотите протестировать и выпустить производственное приложение (конечный продукт, который не будет использоваться другими пакетами), поскольку важно, чтобы установка была как можно более детерминированной, эта установка займет больше времени, но в конечном итоге ваше приложение более надежно (вы включаетеnode_modules
в такой релиз) . Палка сLTS
версиейNode.js
.Бонус: вы можете смешивать их в зависимости от того, насколько сложным вы хотите это сделать. В функциональных ветвях
git
вы можете кэшировать их,node_modules
чтобы повысить производительность своих команд, а в запросах на слияние и в основных ветвях полагаться наnpm ci
определенный результат.источник