Вы можете пропустить чтение статьи и просто перейти к файлу readme
пряжи 2 пользователям: вам это не нужно, прочтите здесь

Через некоторое время использования yarn, когда я перестал бояться обнюхивать файл блокировки, я заметил кое-что подозрительное:
Файл yarn.lock содержит разные версии одного и того же пакета. и многие из них.
Некоторые из них были просто другой версией патча!
И требуемые выражения semver имеют общий диапазон!

Что еще хуже, в некоторых случаях я получал загадочные ошибки TypeScript:

Существуют два разных типа с таким названием, но они не связаны между собой 🧐

И, конечно же, у многих зависимостей были свои собственные рекурсивные node_modules, такие как старый добрый npm 3 days 🤩

Упрощенный пример:

mkdir yarn-dedup-examples
cd yarn-dedup-examples
yarn init -y
yarn add @types/node@^8 # lts/carbon
yarn add @types/fs-extra # promise wrapper of node's fs

Это даст нам дубликат @types/node пакета

yarn add yarn-deduplicate -D; # local. this is best practice!
yarn yarn-deduplicate -s fewer yarn.lock;
yarn install # Don't forget this step.

И в итоге мы получим:

Какое желаемое состояние.

Чтобы лучше понять, что делает дедупликация,
я рекомендую убедиться, что ваши yarn.lock и package.json зафиксированы, запустить инструмент, изучить разницу и зафиксировать изменения!
И, конечно же, прочитать документацию

Использование в CI

Вы можете запустить yarn-deduplicate --list --fail как часть вашего CI перед установкой yarn, чтобы не допустить добавления дубликатов с течением времени. Не забудьте добавить свой флаг стратегии, если вы не используете значение по умолчанию.

Https://github.com/atlassian/yarn-deduplicate#usage-in-ci

Когда также запускать этот инструмент?

  • После установки / удаления зависимостей
  • После обновления зависимостей (если вы еще не знаете, yarn upgrade-interactive, попробуйте прямо сейчас!)
  • rebases / merges, которые блокируют изменения файла / package.json

Другие решения?

Https://yarnpkg.com/lang/en/docs/selective-version-resolutions/ это может немного помочь. Я лично никогда им не пользовался.

Немного предыстории - пряжа нам «врет»

yarn имеет внутренний dedupe, который печатает текст, который пытается убедить вас, что вам не нужны dedupe 🤭

yarn dedupe v1.13.0
error The dedupe command isn't necessary. `yarn install` will already dedupe.
info Visit https://yarnpkg.com/en/docs/cli/dedupe for documentation about this command.

Но если вы поищете проблемы в github yarn, вы найдете похожую: [функция] улучшить дедупликацию разрешения

Обсуждение очень интересное, практическая часть - это ссылка на инструмент под названием yarn-tools, который является ранней итерацией yarn-deduplicate.

Вы можете вручную сделать то, что делает этот инструмент,
а также изменить файл блокировки таким образом, чтобы обмануть yarn, чтобы делать много вещей (не рекомендуется)

Почему пряжа не выполняет дедупликацию пряжи сама по себе?

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

Таким образом, Yarn сохраняет старое разрешение, но предпочитает новейшее при установке новой зависимости. Оглядываясь назад, я думаю, что логичным было бы использовать существующее разрешение, если бы мы стремились к стабильности.
@madbyk, команда yarn v1, из ответов в статье

Стоит отметить, что пряжа 2 имеет встроенную функцию.

Основные выводы:

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

Спасибо, что прочитали!
Бная