Зависимости от сверстников в монорепозитории
Если пакеты в монорепозитории имеют одноранговые зависимости, как сделать эти зависимости доступными для них во время разработки?
Например пакет в /packages/namespace/alpha/
может иметь devDependency
из styled-components
в его package.json
.
Возможные варианты:
Объявите те же зависимости, что и зависимости разработчика (ненужное дублирование и затраты на обслуживание).
Установите пакеты в маршруте монорепозитория
package.json
(потенциальные проблемы с разрешением модуля при использованииyarn link
.
Я использую Lerna с рабочими пространствами пряжи.
1 ответ
Рабочие области пряжи должны устанавливать почти все в корень node_modules
полагаясь на алгоритм разрешения модуля узла. Это то, что вы описали в варианте 2.
Так что в большинстве случаев это должно работать. Проблемы могут возникать, когда какой-либо инструмент полагается на свою собственную логику разрешения, или существуют разные версии некоторых зависимостей и так далее.
Вариант 1 - довольно распространенный подход, но, как вы сказали, он увеличивает стоимость обслуживания. Возможно, вам придется отслеживать такие зависимости и отмечать их как внешние, чтобы не включать их во встроенную версию библиотеки.
Возможны обходные пути. Например, Angular предлагает использовать TSpaths
вариант. И вы можете сделать то же самое без машинописного текста, например, в Create React App с использованием jsconfig.json. Или вы можете использовать что-то похожее на этот накопительный плагин, который автоматизирует добавление внешних элементов на основеpeerDependencies
, так что вы также можете безопасно перечислить их как devDependies.
Оба варианта считаются законными в этом выпуске lerna
Другой вариант - установить ваши одноранговые зависимости, и на данный момент для этого нет "официального" решения. Существует пакет install peers cli, который работает сnpm
а также yarn
. Есть горячий запрос функции дляyarn
. Есть план добавить эту функцию в npm v7, на самом деле npm делала это до v3.
Подводя итоги, не существует универсального решения, и вам нужно понимать, что вы хотите получить и чем можете пожертвовать ради этого.