Ответ 1
Если у вас действительно есть субзависимость, которая чрезмерно ограничительна в тех версиях, которые она примет, вы можете переопределить их с помощью пряжи. Похоже, что исходный вопрос был не совсем точным, но исходный вопрос был тем, на что я хотел ответить, и я нашел ответ, так что вот он для потомков:
Я использую библиотеку socket.io, и она имеет component-emitter
как зависимость. Но он имеет пару версий, которые он требует. Это то, что выглядел как файл yarn.lock, прежде чем я что-то изменил:
[email protected]:
version "1.1.2"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"
[email protected]:
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, который был текущим). Я сначала попробовал просто изменить файл narn.lock:
[email protected], [email protected]^1.2.1, [email protected]:
version "1.2.1"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
Это сработало, но в файле есть предупреждения об автогенерации, что означает, что каждое обновление или новый пакет, который я добавляю, будут топать на этом изменении. Немного поиска нашел параметр yarn --flat
, который заставит пряжу выбирать не более одного пакета для всего проекта. Это кажется излишним для меня, так как я уверен, что есть реальные случаи несовместимости между старыми и более новыми пакетами. Я просто хотел исключить избыточный пакет из моего кода клиента, чтобы уменьшить загрузку; Я все еще хочу, чтобы все пакеты разработки работали правильно.
Но в документах пряжа --flat Я нашел ссылку на блок "резолюции" что может пойти в package.json:
"resolutions": {
"package-a": "2.0.0",
"package-b": "5.0.0",
"package-c": "1.5.2"
}
Итак, я попытался помещать "component-emitter" : "1.2.1"
в новый блок "resolution" в моем package.json, и он фактически сплющил компонент-эмиттер до 1.2.1 для всех мест, которые его требовали, и теперь у меня есть только одна копия в мой код клиента.
ОБНОВЛЕНО EDIT: Пряжа теперь, начиная с 1.0, официально поддерживает блок "резолюций" выше. Так что просто используйте это.