Подтвердить что ты не робот

Как переопределить вложенные зависимости с помощью `пряжи '?

Если у моего пакета эти зависимости

{ "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 установит [email protected] в foobar/node_modules.

Как заставить пряжу использовать пакет [email protected] для foobar?

Я понимаю, что это было бы возможно, используя npm shrinkwrap (a la этот вопрос).


Резюме моего вопроса, вероятно, таково: пряжа создает повторяющиеся, детерминированные установки, но как мне настроить эту установку?

4b9b3361

Ответ 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, официально поддерживает блок "резолюций" выше. Так что просто используйте это.

Ответ 2

Теперь это возможно с пряжей функцией выборочного разрешения версии.

В вашем проекте package.json используйте resolutions:

  "resolutions": {
    "foobar/**/baz": "2.0.9"
  }

Это переопределяет пакет foobar (и любые другие пакеты под ним) версии baz, заставляя его быть версией 2.0.9.

Ответ 3

@SomeCallMeTime , это замечательно, и мы делаем это в течение месяца на работе.

К сожалению, это невозможно с тех пор, как v0.24.x (см. comment).

Там открыт PR на Github с предложением RFC, чтобы иметь простой способ обработки этого прецедента без необходимости следить за сгенерированный файл блокировки.