В чем разница между пряжами и npm shrinkwrap

Недавно я попытался установить мои пакеты Node с пряжей. Он отлично работает, и он намного быстрее, чем NPM. yarn автоматически генерирует yarn.lock. У нас уже есть термоусадочная пленка NPM (npm-shrinkwrap.json).

Есть ли разница между ними? Имеет ли yarn.lock преимущество перед npm-shrinkwrap.json?

Ответ 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 не гарантирует получение того же результата, что и однократное обжатие, тогда как пряжа явно использует "алгоритм установки, который является детерминированным и надежным" .

Ответ 2

Есть ли разница между ними

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

Вы можете найти это в документации для yarn.lock:

Схожая с npms npm-shrinkwrap.json, однако ее не потерять и создает воспроизводимые результаты

Однако остается вопрос, готова ли пряжа к производству. В репозитории GitHub открыт куча ярких ошибок, поэтому я буду ждать его в течение месяца или около того.