У меня есть монорепо, в котором много микросервисов.Есть некоторые функции / классы библиотечного типа, которые я хочу сделать доступными для любого микросервиса, которому это необходимо.Однако, если этот пакет библиотеки объявляет одноранговую зависимость, одноранговая зависимость не обнаруживается при запуске кода из вещи, которая зависит от библиотеки.
Рассмотрим эту структуру репо:
- lib
- some-library (peerDepends on
foo
) - index.js (требуется
foo
) - node_modules будут пустыми
- services
- some-service (зависит от
foo
и some-library
) - index.js (требуется
some-library
) - node_modules будет иметь:
foo
some-library
будет символической ссылкой на ../../lib/some-library
При запуске node services/some-service/index.js
вы получите сообщение об ошибке "Не удается найти модуль 'foo'", исходящее из lib/some-library/index.js
.
Предположительно, это происходит потому, что узел просматривает только lib/some-library/node_modules
илюбая папка node_modules
, которая находится в каталоге предка.Но так как этот код был запущен из services/some-service
(в качестве рабочего каталога) и из-за символической ссылки в services/some-service/node_modules
, я бы ожидал, что это сработает.
Вот репозиторий, к которому можно легко клонироватьсм. проблему: https://github.com/jthomerson/example-local-dependency-problem
git clone git@github.com:jthomerson/example-local-dependency-problem.git
cd example-local-dependency-problem
cd services/some-service
npm install
node index.js
Я вижу только два решения:
- Не использовать peerDependencies внутри библиотеки
- Установить каждую равноправную зависимость вкорень проекта для локальной разработки и тестирования.
Ни один из них не является действительно хорошим решением, поскольку он не позволяет каждому сервису иметь разные версии зависимостей, и, следовательно, означает, чточто если локальная версия (или версия библиотеки) зависимости увеличена, то все службы, использующие библиотеку, будут одновременно повышать версию своих зависимостей, что делает их более хрупкими, потому что все они связаны друг с другом.