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