Как работает package.json?

Аватар пользователя Nikolai Gagarinov
Nikolai Gagarinov
26 августа 2022

Файл 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

1 0
Аватар пользователя Aleksey
Aleksey
05 апреля 2023

Поскольку package-lock.json имеет большое значение, желательно включать его систему версианирования (Git).

Включение package-lock.json в репозиторий позволяет гарантировать, что все разработчики будут использовать одинаковые версии зависимостей, что упрощает совместную работу над проектом и предотвращает возможные проблемы совместимости.

0 0
Основы Frontend за 14 дней
  • 72 урока в онлайн-тренажере
  • 4 живых вебинара и масскодинг
  • Помощь наставника на весь период обучения

Есть что добавить? Зарегистрируйтесь

или войдите в аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Курсы по программированию в Хекслете

Backend-разработка

Разработка серверной части сайтов и веб-приложений

Frontend-разработка

Разработка внешнего интерфейса сайтов и веб-приложений и верстка

Создание сайтов

Разработка сайтов и веб-приложений на JS, Python, Java, PHP и Ruby on Rails

Тестирование

Ручное тестирование и автоматизированное тестирование на JS, Python, Java и PHP

Аналитика данных

Сбор, анализ и интерпретация данных на Python

Интенсивные курсы

Интенсивное обучение для продолжающих

DevOps

Автоматизация настройки локального окружения и серверов, развертывания и деплоя

Веб-разработка

Разработка, верстка и деплой сайтов и веб-приложений, трудоустройство для разработчиков

Математика для программистов

Обучение разделам математики, которые будут полезны при изучении программирования

JavaScript

Разработка сайтов и веб-приложений и автоматизированное тестирование на JS

Python

Веб-разработка, автоматическое тестирование и аналитика данных на Python

Java

Веб-разработка и автоматическое тестирование на Java

PHP

Веб-разработка и автоматическое тестирование на PHP

Ruby

Разработка сайтов и веб-приложений на Ruby on Rails

Go

Курсы по веб-разработке на языке Go

HTML

Современная верстка с помощью HTML и CSS

SQL

Проектирование базы данных, выполнение SQL-запросов и изучение реляционных СУБД

Git

Система управления версиями Git, регулярные выражения и основы командой строки

Похожие вопросы