Нужно ли мне как package-lock.json, так и package.json?

После обновления моего NPM до последней версии (от 3.X до 5.2.0) и запуска npm install в существующем проекте, я получаю автоматически созданный package-lock.json.

Я могу сказать, что package-lock.json дает мне точное дерево зависимостей, а не package.json.

Из этой информации, похоже, package.json избыточен и больше не нужен.

Оба из них необходимы для работы НПМ?
Безопасно или возможно использовать только файл package-lock.json?

Документы на package-lock.json(doc1, doc2) ничего об этом не упоминают.

Изменить:

Подумав об этом, я пришел к выводу, что если кто-то хочет использовать ваш проект с более старой версией NPM (до 5.x), он все равно будет устанавливать все зависимости, но с менее точной версией (версии патчей)

Ответ 1

На странице npm docs:

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

С package.json вы не можете управлять версиями вложенных зависимостей. Даже если вы заблокируете версии своих прямых зависимостей, вы не можете на 100% гарантировать, что ваше полное дерево зависимостей будет одинаковым каждый раз.

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

Следовательно, он не является избыточным, вместо этого предоставляет функциональность для установки дерева зависимостей в строгой среде.

Ответ 2

Вам нужны как package-lock.json и package.json? Нет.

Вам нужен package.json? Да.

У вас есть проект только с package-lock.json? Нет.

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

Ответ 3

Если ваш вопрос заключается в том, что файл блокировки должен быть привязан к вашему исходному элементу управления - он должен. При определенных обстоятельствах это будет проигнорировано.

Я обнаружил, что он раздувает запросы на вытягивание и фиксирует историю, поэтому, если вы видите, что это изменение, сделайте для него отдельную фиксацию.

Ответ 4

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

package.json: записывает минимальную версию, которая нужна вашему приложению. Если вы обновите версии определенного пакета, это изменение не будет отражено здесь.