У меня есть монорепозиторий, в котором много микросервисов. Есть некоторые функции/классы библиотечного типа, которые я хочу сделать доступными для любого микросервиса, который в этом нуждается. Однако, если этот библиотечный пакет объявляет одноранговую зависимость, одноранговая зависимость не будет найдена при запуске кода из того, что зависит от библиотеки.
Рассмотрим эту структуру репо:
- lib
- some-library (peerDepends on
foo
)- index.js (requires
foo
) - node_modules будет пустым
- index.js (requires
- some-library (peerDepends on
- services
- some-service (depends on
foo
, andsome-library
)- index.js (requires
some-library
) - node_modules будет иметь:
foo
some-library
будет символической ссылкой на../../lib/some-library
- index.js (requires
- some-service (depends on
При запуске 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 [email protected]:jthomerson/example-local-dependency-problem.git
cd example-local-dependency-problem
cd services/some-service
npm install
node index.js
Я вижу только два решения:
- Не используйте peerDependencies внутри библиотеки
- Установите каждую одноранговую зависимость в корне проекта для локальной разработки и тестирования.
Ни одно из этих решений не является действительно отличным решением, потому что оно не позволяет каждой службе иметь разные версии зависимостей и, таким образом, означает, что если локальная версия (или версия библиотеки) зависимости изменена, все службы, использующие библиотеку затем их версия зависимостей будет изменена одновременно, что сделает их более хрупкими, потому что все они связаны друг с другом.