Відповіді:
З документів 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 installnpm-shrinkwrap.jsonта package-lock.json(у тому порядку).node_modules.package.jsonабо package-lock.json.
npm i packagename), він може написати, package.jsonщоб додати або оновити залежність.npm i) може записувати, щоб package-lock.jsonзаблокувати версію деяких залежностей, якщо вони вже відсутні в цьому файлі.npm cipackage-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 installWhithout аргументи будуть тільки зміни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. Чи знаєте ви, що тут може написати?