Ответ 1
Файл yarn.lock
очень похож на файл блокировки других менеджеров пакетов, особенно менеджер пакетов Rust Cargo, который имеет Cargo.lock
. Идея этих файлов блокировки - представлять собой согласованный набор пакетов, который должен всегда работать.
npm
хранит диапазоны зависимостей в файле package.json
, что означает, что когда кто-то устанавливает ваш пакет, они могут получить для вас другой набор зависимостей, поскольку вы можете использовать устаревшие пакеты (хотя они все еще удовлетворяют зависимости диапазон, который вы указали). Возьмем, к примеру, человека, который указал зависимость "foo": "^1.0.0"
. Возможно, на самом деле они установили foo v1.0.1, поскольку это было последним, когда они запускали npm install
, но позже кто-то устанавливает ваш пакет и получает зависимость foo v1.1.0. Это может нарушить что-то неожиданное, чего можно избежать, если у вас есть файл yarn.lock
, который гарантирует согласованное разрешение пакета.
Что касается сравнения с npm shrinkwrap
, документация объясняет это очень четко:
Схожая с npms npm-shrinkwrap.json, однако она не потеряет и создает воспроизводимые результаты.
В документации также рекомендуется передать yarn.lock
в ваши репозитории, если вы еще этого не сделали, чтобы вы могли воспользоваться преимуществами последовательного и воспроизводимого разрешения пакета. Этот вопрос также объясняет, почему вы должны это делать.
Поведение потерь npm shrinkwrap
обусловлено недетерминированными алгоритмами, используемыми самим npm
; как указано в комментариях к другому ответу, npm shrinkwrap
> npm install
> npm shrinkwrap
не гарантирует получение того же результата, что и однократное обжатие, тогда как пряжа явно использует "алгоритм установки, который является детерминированным и надежным" .