Как работает package.json?
Файл package.json позволяет указать диапазон версий пакетов, которые нужно ставить. Это нужно, чтобы не следить вручную за появлением новых версий пакетов. Разработчики договорились между собой, что будут использовать семантическое версионирование при создании пакетов:
X.1.1
, где X — это мажорная версия, которая может содержать несовместимые с предыдущей версией изменения1.X.1
, где X — это минорная версия, которая скорее всего содержит совместимые с предыдущей версией изменения1.1.X
, где X — это патч-версия, которая содержит различные исправления
Зачем это нужно? Бывает, что нужно создать что-то кардинально новое, но при этом не помешать пользователям работать со старой версией. Старая и новая версия могут иметь совершенно разный интерфейс, функции и требования. Например, требования к языку или интерпретатору. Но при этом иногда обнаруживаются баги в старой версии и её нужно поддерживать. Соответственно вносятся изменения и в старую, и в новую версию.
Возьмем для примера пакет с версией 1.0.0. Спустя время у него появилась версия 1.2.3. Разработчики решили, что хотят что-то кардинально поменять и выпускают новую версию 2.0.0. Но на старой версии нашли уязвимость, к ней выпустили патч — версия поднялась до 1.2.4.
Как я выше написал, мы можем указать, какую версию можем использовать Например, в диапазоне >=1.2.3 <2.0.0
. И если у зависимости будет новая версия 2, то она будет проигнорирована, будет установлена максимальная версия 1.
Но что если сегодня установим проект на наш комп, а завтра на продакшен, а в это время версии пакетов случайно обновятся и что-то сломается? Это неудобно. Поэтому существуют лок-файлы (package.lock), в котором фиксируется версия пакетов. Именно эта версия будет устанавливаться в каждом запуске, пока мы обновим package.lock.
Когда мы хотим установить зависимости, мы можем использовать npm install
или npm ci
(Clean Install). Разница между ними следующая:
- npm install создаст lock-файл, если его нет. Для npm ci лок-файл обязателен
- Если зависимости в package.json и package.lock не совпадают, то npm ci упадет с ошибкой
- npm ci ставит все зависимости, npm install позволяет поставить зависимости индивидуально (добавить в package.json)
- Если директория node_modules существует, то npm ci её удалит, зависимости поставятся с нуля
Если необходимо, то пакеты можно обновить командой npm update <pkg>
, либо изменив package.json и выполнив npm install
Поскольку package-lock.json
имеет большое значение, желательно включать его систему версианирования (Git).
Включение package-lock.json
в репозиторий позволяет гарантировать, что все разработчики будут использовать одинаковые версии зависимостей, что упрощает совместную работу над проектом и предотвращает возможные проблемы совместимости.