Відповіді:
З документів npm :
Коротше кажучи, основні відмінності між використанням npm install та npm ci:
- Проект повинен мати існуючий пакет-lock.json або npm-shrinkwrap.json.
- Якщо залежності в блокуванні пакета не збігаються з параметрами пакета.json, npm ci вийде з помилкою замість оновлення блокування пакета.
- npm ci може встановлювати лише цілі проекти за один раз: окремі залежності не можна додавати за допомогою цієї команди.
- Якщо модуль node_ вже присутній, він буде автоматично видалений до того, як npm ci почне встановлення.
- Він ніколи не запише в package.json або будь-який із пакетів-замків: установки по суті заморожені.
По суті,
npm install
читає, package.json
щоб створити список залежностей і використовує package-lock.json
для інформування, які версії цих залежностей встановити. Якщо залежної немає, package-lock.json
вона буде доданаnpm install
.
npm ci
(названий за назвою C Itegration 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
Whithout аргументи будуть тільки зміниpackage-lock.json
npm ci
видалить будь-яку існуючу папку node_modules і покладається на package-lock.json
файл для встановлення конкретної версії кожного пакета. Це значно швидше, ніж встановити npm, оскільки він пропускає деякі функції. В чистому стані встановлення чудово підходить для ci / cd конвеєрів та докерних будівель! Ви також використовуєте його для установки відразу всіх, а не конкретних пакетів.
Документація, яку ви зв'язали, мала короткий виклад:
Коротше кажучи, основні відмінності між використанням npm install та npm ci:
- Проект повинен мати існуючий пакет-lock.json або npm-shrinkwrap.json.
- Якщо залежності в блокуванні пакета не збігаються з параметрами пакета.json, npm ci вийде з помилкою замість оновлення блокування пакета.
- npm ci може встановлювати лише цілі проекти за один раз: окремі залежності не можна додавати за допомогою цієї команди.
- Якщо модуль node_ вже присутній, він буде автоматично видалений до того, як npm ci почне встановлення.
- Він ніколи не запише в package.json або будь-який із пакетів-замків: установки по суті заморожені.
Команди дуже схожі за функціональністю, однак різниця полягає у підході до встановлення залежностей, визначених у ваших файлах package.json
та package-lock.json
файлах.
npm ci
виконує чітку установку всіх залежностей вашого додатка, тоді як npm install
може пропустити деякі установки, якщо вони вже існують у системі. Проблема може виникнути, якщо версія, вже встановлена в системі, не та, яку ви package.json
планували встановити, тобто встановлена версія відрізняється від ' необхідної ' версії.
Інші відмінності полягають у тому, що npm ci
ніколи не торкається ваших package*.json
файлів. Він зупинить установку і покаже помилку, якщо версії залежності не збігаються у файлах package.json
та package-lock.json
.
Ви можете прочитати набагато краще пояснення з офіційних документів тут .
Крім того, ви можете прочитати про пакет замків тут .
Варто мати на увазі, що для зображень докера легкого вузла, таких як альпійський, не встановлено 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. Чи знаєте ви, що тут може написати?