Яка різниця між “npm install” та “npm ci”?


215

Я працюю з постійною інтеграцією і виявив команду npm ci .

Я не можу зрозуміти, у чому переваги використання цієї команди для мого робочого процесу.

Це швидше? Чи робить це тест складніше, добре, і після?

Відповіді:


328

З документів 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

  • Потрібен принаймні npm v5.7.1 .
  • Вимагає 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

1
Я не знав, що можу npm installнаписати на package.json. Чи знаєте ви, що тут може написати?
Веве

5
добре, що може бути трохи оманливим ... він запише до package.json, коли ви використовуєте його для встановлення, оновлення або видалення залежностей. Я зрозумію це в тексті, дякую!
lucascaro

Де цей алгоритм задокументований? Тобто, що ваше джерело?
Інгвар Крістіансен

1
@YngvarKristiansen це в документації npm, додав посилання на конкретний розділ для ознайомлення
lucascaro

4
npm install packageможе змінити як package-lock.json і package.json , в той час як npm installWhithout аргументи будуть тільки зміниpackage-lock.json
knobo

20

npm ciвидалить будь-яку існуючу папку node_modules і покладається на package-lock.jsonфайл для встановлення конкретної версії кожного пакета. Це значно швидше, ніж встановити npm, оскільки він пропускає деякі функції. В чистому стані встановлення чудово підходить для ci / cd конвеєрів та докерних будівель! Ви також використовуєте його для установки відразу всіх, а не конкретних пакетів.


9

Документація, яку ви зв'язали, мала короткий виклад:

Коротше кажучи, основні відмінності між використанням npm install та npm ci:

  • Проект повинен мати існуючий пакет-lock.json або npm-shrinkwrap.json.
  • Якщо залежності в блокуванні пакета не збігаються з параметрами пакета.json, npm ci вийде з помилкою замість оновлення блокування пакета.
  • npm ci може встановлювати лише цілі проекти за один раз: окремі залежності не можна додавати за допомогою цієї команди.
  • Якщо модуль node_ вже присутній, він буде автоматично видалений до того, як npm ci почне встановлення.
  • Він ніколи не запише в package.json або будь-який із пакетів-замків: установки по суті заморожені.

2

Команди дуже схожі за функціональністю, однак різниця полягає у підході до встановлення залежностей, визначених у ваших файлах package.jsonта package-lock.jsonфайлах.

npm ciвиконує чітку установку всіх залежностей вашого додатка, тоді як npm installможе пропустити деякі установки, якщо вони вже існують у системі. Проблема може виникнути, якщо версія, вже встановлена ​​в системі, не та, яку ви package.jsonпланували встановити, тобто встановлена ​​версія відрізняється від ' необхідної ' версії.

Інші відмінності полягають у тому, що npm ciніколи не торкається ваших package*.jsonфайлів. Він зупинить установку і покаже помилку, якщо версії залежності не збігаються у файлах package.jsonта package-lock.json.

Ви можете прочитати набагато краще пояснення з офіційних документів тут .

Крім того, ви можете прочитати про пакет замків тут .


1

Варто мати на увазі, що для зображень докера легкого вузла, таких як альпійський, не встановлено Python, залежність node-gypякого використовується npm ci.

Я думаю, що трохи впевнено, що для npm ciроботи вам потрібно встановити Python як залежність у вашій збірці.

Більше інформації тут Docker та npm - gyp ERR! не добре


0

Хоча всі інші відповіли на технічні відмінності, ніхто не пояснює, у яких ситуаціях використовувати обидва.

Ви повинні використовувати їх у різних ситуаціях.

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детермінований результат.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.