Как переопределить вложенные зависимости с помощью `yarn`?
Если мой пакет имеет эти зависимости
{ "name": "my-package",
"dependencies": { "foobar":"~1.0.3", "baz":"2.0.9" }
И foobar
пакет имеет эти зависимости
{ "name": "foobar",
"dependencies": { "baz":"^2.0.0" }
и самая последняя выпущенная версия baz
является 2.1.0
Первый прогон yarn
установлю baz@2.1.0
в foobar/node_modules
,
Как заставить пряжу использовать baz@2.0.9
пакет для foobar
?
Я понимаю, что это было бы возможно с помощью npm shrinkwrap
(а-ля этот вопрос).
Суть моего вопроса, вероятно, такова: пряжа создает повторяющиеся, детерминированные установки, но как мне настроить эту установку?
3 ответа
Если у вас действительно есть субзависимость, которая чрезмерно ограничивает то, какие версии она будет принимать, вы можете переопределить их, используя пряжу. Похоже, первоначальный вопрос был не совсем правильным, но на самом деле исходный вопрос был тем, на который я хотел ответить, и я нашел ответ, так что вот для потомков:
Я использую библиотеку socket.io, и она имеет component-emitter
как зависимость. Но у него есть пара версий, которые ему требуются. Вот как выглядел файл yarn.lock, прежде чем я что-то изменил:
component-emitter@1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"
component-emitter@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe"
Так что в мой клиентский код было включено две копии компонента-эмиттера. Я посмотрел, и не было никаких серьезных изменений между 1.1.2 и 1.2.0 (или 1.2.1, которая была текущей). Сначала я попытался просто изменить файл yarn.lock:
component-emitter@1.2.1, component-emitter@^1.2.1, component-emitter@1.1.2:
version "1.2.1"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
Это сработало, но в файле есть предупреждения о том, что он автоматически сгенерирован, а это означает, что каждое добавленное мной обновление или новый пакет будет давить на это изменение. Немного поиска нашел yarn --flat
опция, которая заставит пряжу выбирать не более одного из каждого пакета во всем проекте. Это кажется излишним для меня, так как я уверен, что есть реальные случаи несовместимости между старыми и новыми пакетами. Я просто хотел исключить избыточный пакет из моего клиентского кода, чтобы уменьшить загрузку; Я все еще хочу, чтобы пакеты для разработки работали правильно.
Но в документации к yarn --flat я нашел ссылку на блок " olutions ", который можно найти в package.json:
"resolutions": {
"package-a": "2.0.0",
"package-b": "5.0.0",
"package-c": "1.5.2"
}
Поэтому я попытался положить "component-emitter" : "1.2.1"
в новом блоке "olutions"в моем package.json, и он фактически сгладил компонент-эмиттер до 1.2.1 для всех мест, где он был необходим, и теперь у меня есть только одна копия в моем клиентском коде.
ОБНОВЛЕНО РЕДАКТИРОВАНИЕ: Пряжа теперь, начиная с 1.0, официально поддерживает блок "разрешения" выше. Так что просто используйте это.
Теперь это возможно с функцией выборочного разрешения пряжи.
В вашем проекте package.json
использовать resolutions
:
"resolutions": {
"foobar/**/baz": "2.0.9"
}
Это переопределяет пакет foobar
's (и любые другие пакеты под ним) версия baz
, заставляя его быть версией 2.0.9.
SomeCallMeTim великолепен, и мы занимаемся этим уже месяц на работе.
К сожалению, это больше невозможно, так как v0.24.x (см. Этот комментарий).
На Github есть открытый PR с предложением RFC, чтобы иметь простой способ обработки этого варианта использования без необходимости следить за сгенерированным файлом блокировки.