Как разрешить ад зависимости в 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 сломается)
Вопросы
Как мне удается удовлетворить оба варианта использования зависимости my_library?
(A) В случае, если external_library потребует jquery, совместимый с моим
peerDependencies
определение (>=2.0.0
), я все еще должен был бы установить jquery вручную? Или npm разрешит общую версию?(Б) Есть ли случаи, когда
peerDependencies
не жалуется и не требует устанавливать что-либо вручную? (до тех пор, пока почитаются почтальоны?)(A) Имеет ли смысл помещать такую зависимость, как jquery (высокая вероятность конфликтов), либо внутри
peerDependencies
(с максимально свободным семвером) и внутриdependencies
с рекомендованной версией?(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.