Lerna. Установить зависимости в корневой проект

У меня стандарт Lerna хранилище как это:

my-repo
 - package.json
 - packages
   - api
     - package.json
   - web-app 
     - package.json

Если мне нужна одинаковая зависимость в обоих пакетах (например, lodash), затем люди из учебных пособий предлагают установить его на оба подмодуля, а затем запустить проект с lerna bootstrap --hoist флаг.

Потому что --hoist флаг lodash зависимость будет загружена только на корневой уровень node_modules но оба подмодуля будут содержать его в качестве зависимости в соответствующих package.json

Но алгоритм разрешения пакетов Node ищет дерево файлов в поисках node_modules папка.

Итак, мой вопрос: почему я не могу просто установить общие зависимости в проект корневого уровня? затем lodash будет расположен под корнем node_modules, И субмодули (пакеты) найдут его, потому что Node будет искать node_module пока корень файловой системы не будет достигнут.

По крайней мере, это поможет мне избежать использования редких lerna bootstrap --hoist, так же как lodash зависимость будет присутствовать только один раз на верхнем уровне package.json (и не дважды: в package.json обоих подмодулей)

2 ответа

Итак, мой вопрос: почему я не могу просто установить общие зависимости в проект корневого уровня?

Вы можете, и вы правы, алгоритм разрешения узла найдет общую зависимость в порядке. Недостатком этого является то, что вы теряете гибкость, и вам нужно будет развернуть или работать со всем моно-репо, что может подойти вам. Более традиционный подход - сохранить производственные зависимости в подпакетах, чтобы вы могли публиковать пакеты и использовать их по отдельности, не завися от корня monorepo, но, опять же, это может быть не важно для вас.

Если ваши пакеты представляют собой пакеты npm, которые вы собираетесь повторно использовать, опубликовав в каком-либо реестре npm, вам следует указать для них правильные зависимости package.json.

В пакете всегда должно быть указано , что ему требуется для работы. Например, если вашему пакету «api» требуется lodash во время выполнения, то он ДОЛЖЕН иметь lodash в своих зависимостях. В противном случае приложение могло бы установить его без lodash; тогда он не сможет запуститься.

В вашем репозитории lerna ваш «корневой» package.json не подключен ни к какому пакету npm и не публикуется, поэтому он не влияет на ваши «настоящие» пакеты npm: «api» и «web-app».

Наконец, если вы не собираетесь публиковать свои пакеты как пакеты npm, делайте все, что хотите. Лерна, вероятно, перебор в этом случае. Даже package.json является излишним, потому что он просто используется для своих целей. .

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