package-lock.json: воспроизводимость проекта Node.js

Файл package-lock.json (или yarn.lock в Yarn) содержит древовидную структуру зависимостей проекта. Его назначение — обеспечение воспроизводимости среды разработки.

При установке зависимостей, указанных в package.json, устанавливаются также их собственные зависимости и зависимости зависимостей (рекурсивно). package-lock.json хранит дерево всех установленных зависимостей с указанием их версий.

Проблемы без package-lock.json

Рассмотрим проект с зависимостью dependency A, версия которой указана как ^1.2.3 в package.json. Это означает, что допускаются минорные и патчные обновления.

Если на одном компьютере npm install установил версию 1.2.3 (последнюю на момент установки), а затем проект опубликован на GitHub без папки node_modules, то другой разработчик, клонировав репозиторий и выполнив npm install, может получить версию 1.3.3 (если она стала последней совместимой версией).

Результат: разные версии dependency A на разных компьютерах. Минорное обновление часто добавляет новые функции. Разработчик с более новой версией может использовать эти функции, что при слиянии изменений с проектом, использующим более старую версию, может привести к конфликтам.

Проблемы с зависимостями зависимостей

Даже если версия dependency A не изменилась, её зависимость dependency B могла обновиться с 2.0.0 до 2.1.0. Использование только package.json может привести к несоответствиям версий зависимостей, даже если dependency B не указана явно в package.json (она определяется через dependency A).

Решение: package-lock.json

package-lock.json решает эту проблему, содержа точные версии всех пакетов. После удаления node_modules и публикации проекта, все разработчики, клонирующие репозиторий и выполняющие npm install, установят одинаковые версии пакетов.

Задание

Далее приводится практическое задание для проверки понимания влияния обновления версий пакетов. Подробности будут представлены позже.

Что будем искать? Например,программа