Зависимости от сверстников в монорепозитории

Если пакеты в монорепозитории имеют одноранговые зависимости, как сделать эти зависимости доступными для них во время разработки?

Например пакет в /packages/namespace/alpha/ может иметь devDependency из styled-components в его package.json.

Возможные варианты:

  1. Объявите те же зависимости, что и зависимости разработчика (ненужное дублирование и затраты на обслуживание).

  2. Установите пакеты в маршруте монорепозитория 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.

Подводя итоги, не существует универсального решения, и вам нужно понимать, что вы хотите получить и чем можете пожертвовать ради этого.

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