Простое руководство по важным командам 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 .
Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.