Я работаю с непрерывной интеграцией и обнаружил команду 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
(названный в честь постоянной интеграции) устанавливает зависимости непосредственно из 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
or package-lock.json
.
npm i packagename
) it may write to package.json
to add or update the dependency.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. Вы знаете, что здесь могло быть написано?
- person Veve; 15.11.2018
npm install package
может изменять как package-lock.json
, так и package.json
, а npm install
без аргументов изменяет только package-lock.json
- person knobo; 08.08.2019
package-lock.json
, мы можем переписать "require": true"
в package-lock.json
.
- person PuiMan Cheui; 21.01.2020
npm install
?
- person BMW; 22.01.2020
npm install
устанавливает devDependencies
, а npm ci
нет, насколько я понимаю.
- person Link14; 23.01.2020
devDependencies
управляется флагом --production
или переменной среды NODE_ENV
как для npm i
, так и для npm ci
- person lucascaro; 17.02.2020
ci
в npm ci
лучше понимать как чистую установку, а не непрерывную интеграцию.
- person William Denman; 05.03.2021
in short
не короткий ..
- person user218867; 10.05.2021
npm ci
удалит любую существующую папку node_modules и использует package-lock.json
файл для установки конкретной версии каждого пакета. Это значительно быстрее, чем установка npm, поскольку в нем отсутствуют некоторые функции. Его установка в чистом состоянии отлично подходит для конвейеров ci / cd и сборок докеров! Вы также можете использовать его для установки всего сразу, а не отдельных пакетов.
В документации, которую вы связали, было резюме:
Короче говоря, основные различия между использованием npm install и npm ci:
- У проекта должен быть существующий package-lock.json или npm-shrinkwrap.json.
- Если зависимости в блокировке пакета не совпадают с зависимостями в package.json, npm ci выйдет с ошибкой вместо обновления блокировки пакета.
- npm ci может устанавливать только целые проекты за раз: отдельные зависимости не могут быть добавлены с помощью этой команды.
- Если node_modules уже присутствует, он будет автоматически удален до того, как npm ci начнет свою установку.
- Он никогда не будет писать в package.json или какие-либо блокировки пакетов: установки по существу замораживаются.
Вы должны использовать их в разных ситуациях.
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
для детерминированного результата.
npm i
следует использовать вместо npm ci
, кроме случаев, когда вы хотите обновить свои зависимости. npm ci
всегда лучше, потому что детерминированное поведение всегда лучше
- person enanone; 20.03.2021
npm i
кеширует, поскольку он быстрее, npm ci
медленнее, так как он выполняет полную переустановку. Они оба полезны.
- person basickarl; 23.03.2021
npm ci
работает так же быстро, если каждый пакет находится в кеше npm
- person enanone; 23.03.2021
npm ci
значительно медленнее, даже если это делается многократно, с локальным кешем NPM: npm install
составляет около 2 с, npm ci
16 с при запуске для того же проекта. После очистки кеша они такие же. Нам отчаянно нужно что-то, что можно было бы установить из package-lock, но не начинайте с удаления node_modules: github. ru / npm / cli / issues / 564
- person Piedone; 14.04.2021
Команды очень похожи по функциональности, однако разница заключается в подходе к установке зависимостей, указанных в ваших 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! не в порядке