В чем разница между yarn.lock и термоусадочной пленкой npm?

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

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

2 ответа

Решение

yarn.lock файл очень похож на файлы блокировки других менеджеров пакетов, особенно менеджер пакетов Cargo Rust, который имеет Cargo.lock, Идея этих файлов блокировки состоит в том, чтобы представлять согласованный набор пакетов, которые всегда должны работать.

npm хранит диапазоны зависимостей в package.json файл, что означает, что когда кто-то устанавливает ваш пакет, он может получить другой набор зависимостей, поскольку вы можете запускать устаревшие пакеты (хотя они все еще удовлетворяют указанному вами диапазону зависимостей). Взять, к примеру, того, кто указал зависимость "foo": "^1.0.0", Возможно, они фактически установили foo v1.0.1, потому что это был последний раз, когда они запускались npm install, но позже кто-то устанавливает ваш пакет и получает зависимость foo v1.1.0. Это может что-то неожиданно сломать, чего можно избежать, если у вас есть yarn.lock файл, который гарантирует согласованное разрешение пакета.

Что касается сравнения с npm shrinkwrap Документация объясняет это очень четко:

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

Документация также советует совершать yarn.lock в ваши репозитории, если вы этого еще не сделали, так что вы можете воспользоваться преимуществами последовательного и воспроизводимого разрешения пакетов. Этот вопрос также объясняет, почему вы должны это сделать.

Поведение с потерями npm shrinkwrap происходит из-за недетерминированных алгоритмов, используемых npm сам; как указано в комментариях к другому ответу, npm shrinkwrap > npm install > npm shrinkwrap не гарантируется, что он выдаст тот же результат, что и однократное сжатие, тогда как Yarn явно использует "алгоритм установки, который является детерминированным и надежным".

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

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

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

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

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

Другие вопросы по тегам