Простое руководство по важным командам npm

Мы знаем, что нам нужно запустить npm install для установки зависимостей. Но что именно происходит, когда мы запускаем npm install? Что произойдет, если мы запустим npm update? А если уже есть команда npm install, то зачем еще и npm clean-install?

package.json и package-lock.json

Прежде всего, давайте проясним разницу между package.json и package-lock.json:

  • package.json содержит информацию о разрешенной для установки версии. Это может быть точная версия, но часто вы найдете что-то вроде этого: "examplePackage": ^4.16.0 . Это сообщает npm, что минимальное требование к версии — 4.16.0, и все младшие выпуски и выпуски исправлений до < 5.0.0 также приемлемы. О семантическом версионировании можно прочитать здесь.
  • package-lock.json всегда содержит информацию о точной версии пакета. Пример: "examplePackage": 4.16.5

Сравнение установки Npm и чистой установки npm

Что именно происходит, когда мы запускаем npm install?

Это зависит от того, какие файлы присутствуют в каталоге, из которого вы запускаете эту команду. Давайте рассмотрим некоторые случаи.

Случай 1: папка node_modules не существует / пакет еще не установлен / существует package-lock.json

Предположим, мы загружаем репозиторий, содержащий файлы package.json и package-lock.json. Папка node_modules обычно явно исключается из git. Таким образом, нам нужно установить зависимости локально. Когда мы запускаем npm install, устанавливается точная версия зависимостей, определенная в package-lock.json. Npm загружает модули и добавляет их в каталог node_modules, который создается автоматически.

added 1 package, and audited 2 packages in 577ms

Мы также можем запустить npm clean-install здесь.

npm clean-install, как и npm install, устанавливает именно ту версию, которая указана в package-lock.json.

added 1 package, and audited 2 packages in 518ms

Предположим, что самый последний выпуск examplePackage — это версия 4.17.0.

Наш package.json содержит информацию "examplePackage": ^4.16.0, а наш package-lock.json "examplePackage": 4.16.5.

Это говорит нам о том, что доступна более поздняя версия пакета, чем текущая установленная, а спецификация версии в package.json позволяет нам выполнить обновление. Однако npm install или npm clean-install установит именно версию 4.16.5 и не обновит.

Для этого у нас есть команда npm update. npm update проверит наличие самой последней версии каждого пакета и установит ее, если это разрешено package.json. Поэтому он обновляет файлы в node_modules, а также package-lock.json.

Причина, по которой у нас есть такое различие между npm install/npm clean install и npm update, заключается в том, что мы хотим, чтобы была установлена ​​та же версия, что и у других людей, загружающих в репозиторий. Именно поэтому вы отправляете и извлекаете package-lock.json в свой репозиторий и из него.

Случай 2: пакет уже установлен с разрешенной версией / существует package-lock.json

Единственная разница между этим и предыдущим случаем заключается в том, что здесь пакет уже установлен. Если вы запустите npm install в таком каталоге, ничего не изменится.

up to date, audited 2 packages in 403ms

npm проверяет пакеты и их версии в package.json и сравнивает с установленными версиями в package-lock.json. Поскольку установленная версия удовлетворяет требованиям версии package.json, ничего не устанавливается.

Одно отличие команд состоит в том, что npm clean-install удаляет каталог node_modules перед переустановкой всех пакетов, определенных в package-lock.json. Поэтому переустанавливает.

added 1 package, and audited 2 packages in 559ms

Случай 3: пакет установлен, но версия не разрешена/Несовместимые версии в package.json и package-lock.json

Это произойдет, если версия в package.json будет изменена вручную. Как при редактировании файла в редакторе кода.

Скажем, мы меняем package.json с "examplePackage": ^4.16.0 на "examplePackage": 4.16.0. Теперь package-lock.json с "examplePackage": 4.16.5 больше недействителен.

В этом случае при запуске npm install менеджер пакетов заметит это несоответствие и сделает следующее:

  • Установите версию, указанную в package.json, в папку node_modules.
  • Обновите версию, указанную в package-lock.json.

Npm install обычно не пишет в package-lock.json (учитывая, что package-lock.json уже существует и пакет уже установлен). Это произойдет только в том случае, если вы вручную измените версию пакета в package.json, чтобы версия в package-lock.json больше не совпадала. В отличие от npm install, npm clean-install никогда не пишет в package-lock.json. Если вы запустите npm clean-install и у вас будут несовместимые версии в package.json и package-lock.json, npm выдаст ошибку, и выполнение команды прекратится.

В приведенном ниже примере package.json содержит "typescript": "4.8.3”, а package-lock.json содержит “4.9.3”. При запуске npm clean-install появляется сообщение об ошибке:

Invalid: lock file's [email protected] does not satisfy [email protected]

При запуске npm install :

changed 1 package, and audited 2 packages in 1s

Как подтверждают выходные данные npm и просмотр файла package-lock.json, версия была изменена на "typescript": "4.8.3”.

Случай 4: Отсутствует папка package-lock.json/node_modules

Если файл package-lock.json вообще отсутствует, он создается при запуске npm install. В этом случае будут установлены самые последние доступные версии пакетов, разрешенные package.json, и будет создан package-lock.json.

Случай 5: Отсутствует папка package-lock.json/node_modules

Отличие от предыдущего случая в том, что модуль уже установлен. Как и в случае 4, файл package-lock.json создается при запуске npm install.

Однако, поскольку модуль уже существует, npm не устанавливает ничего нового, а только генерирует файл. Package-lock.json будет содержать те же версии, что и версии пакета, найденные в папке node_modules.

При запуске npm clean-install в каталоге без файла package-lock.json возникает ошибка.

The `npm ci` command can only install with an existing package-lock.json or
npm-shrinkwrap.json with lockfileVersion >= 1. Run an install with npm@5 or
later to generate a package-lock.json file, then try again.

Краткое содержание

При работе над проектом с несколькими разработчиками важно, чтобы у всех были установлены модули npm в одинаковых версиях. Вот почему package.json, а также package-lock.json должны быть переданы в git. При использовании npm install или npm clean-install устанавливаются точные версии, указанные в package-lock.json, если они еще не установлены. Новые версии устанавливаются только тогда, когда A) доступна новая версия, B) спецификация версии в package.json допускает более новые версии и C) при использовании npm update или npm install, когда отсутствует файл package-lock.json.

npm clean-install является более строгим, чем npm install, потому что выдает ошибку при обнаружении несовместимых версий, а также не позволяет выполнить установку без наличия файла package-lock.json.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.