Как разрешить ад зависимости в NPM с peerDependencies

Настроить:

Учитывая следующие моменты

  • my_library широко использует jquery во время выполнения.
  • в my_library jquery требуется через npm ^3.3.1 по умолчанию (из-за исправлений безопасности в нем). Однако он совместим также с jquery> = 2.2.0 (но не указан в package.json, еще)
  • my_library используется в custom_project через npm.
  • Для custom_project требуется также external_library, в котором используются разные и конфликтующие версии jquery (например, jquery 1.7.3).
  • вместо этого custom_project_2 просто требуется my_library в dependencies,

Проблемы:

  • установка custom_project вызовет повторяющиеся зависимости, испортит jquery для одной из двух библиотек.
  • версия jquery в my_library dependencies указывает предлагаемую версию (во избежание критических уязвимостей), но ничего не говорит о том, какая минимальная версия jquery совместима с my_library

Возможное решение:

Чтобы избежать дублирования зависимостей jquery (1.7.3 для external_library и 3.3.1 для my_library), я мог бы переместить свой jquery ^3.3.1 из dependencies в devDependencies, так что я получу 3.3.1 на разработке, пока она не будет установлена ​​на производстве (npm install --only=prod) и просто будет установлен jquery 1.7.3.

Но это:

  • не гарантирует, что my_library получит совместимую версию jquery, поэтому my_library может легко сломаться.
    • добавление jquery@>=2.2.0 внутри моей библиотеки peerDependencies по крайней мере вызовет WARN с просьбой разрешить конфликт вручную, установив определенную версию в custom_project (хотя, вероятно, это не может быть решено).
  • мне кажется, что JQuery - это среда выполнения dependency и не должен идти в devDependencies (с инструментами юнит-тестирования и т. д.). На самом деле, jquery не будет установлен в custom_project_2 при установке в производство (так что my_library сломается)

Вопросы

  1. Как мне удается удовлетворить оба варианта использования зависимости my_library?

  2. (A) В случае, если external_library потребует jquery, совместимый с моим peerDependencies определение (>=2.0.0), я все еще должен был бы установить jquery вручную? Или npm разрешит общую версию?

  3. (Б) Есть ли случаи, когда peerDependencies не жалуется и не требует устанавливать что-либо вручную? (до тех пор, пока почитаются почтальоны?)

  4. (A) Имеет ли смысл помещать такую ​​зависимость, как jquery (высокая вероятность конфликтов), либо внутри peerDependencies (с максимально свободным семвером) и внутри dependencies с рекомендованной версией?

  5. (B) Будет ли это работать правильно в каждой настройке и с версией NPM <3 (peerDependencies автоматически устанавливается) и >=3 (необходима ручная установка)?

Ценятся, если вы можете ответить даже на часть вопросов

0 ответов

Можно ли предположить, что зависимость my_library от jquery является зависимостью от однорангового узла? И что вы входите в команду разработчиков my_library?

Если это так, лучшим решением может быть изменение зависимости узла my_library от jquery на обычную зависимость. Если я правильно понимаю эту статью, только одноранговые зависимости могут вызывать конфликты между пакетами, обычные пакеты устанавливаются в подкаталоги, поэтому my_library получает собственную версию jquery, установленную отдельно от external_library.

Однако может быть просто невозможно преобразовать одноранговую зависимость в обычную зависимость. https://medium.com/@jacob.h.page/common-npm-mistakes-51bf8989079f

Ваш модуль - это плагин для какой-то библиотеки или фреймворка? Тогда эта библиотека / фреймворк является одноранговой зависимостью. Приложение-потребитель отвечает за выбор и интеграцию набора взаимно совместимых плагинов; сами плагины не должны вводить указанную структуру напрямую, а вместо этого должны указывать максимально широкий диапазон версий, чтобы сделать работу по интеграции как можно проще.

Другой вариант - дождаться, пока external_library выпустит новую версию, совместимую с последней версией jquery.

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