Использование одноранговых зависимостей с локальными (file:../some-lib) зависимостями
У меня есть монорепо, в котором много микросервисов. Есть некоторые функции / классы библиотечного типа, которые я хочу сделать доступными для любого микросервиса, которому это необходимо. Однако, если этот пакет библиотеки объявляет одноранговую зависимость, одноранговая зависимость не обнаруживается при запуске кода из вещи, которая зависит от библиотеки.
Рассмотрим эту структуру репо:
- Lib
- некоторая библиотека (peerDepends on
foo
)- index.js (требуется
foo
) - node_modules будут пустыми
- index.js (требуется
- некоторая библиотека (peerDepends on
- Сервисы
- некоторые услуги (зависит от
foo
, а такжеsome-library
)- index.js (требуется
some-library
) - node_modules будут иметь:
foo
some-library
будет символической ссылкой на../../lib/some-library
- index.js (требуется
- некоторые услуги (зависит от
При беге 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 внутри библиотеки
- Установите каждую одноранговую зависимость в корне проекта для локальной разработки и тестирования.
Ни один из них не является действительно отличным решением, потому что он не позволяет каждому сервису иметь разные версии зависимостей, и, следовательно, означает, что если локальная версия (или версия библиотеки) зависимости повышается, все службы, которые используют библиотеку затем одновременно повышают версию их зависимостей, что делает их более хрупкими, потому что все они связаны друг с другом.
1 ответ
Как насчет добавления --preserve-symlinks
флаг? Например:
node --preserve-symlinks index.js
У меня было двойное рабочее пространство, в котором:
рабочая область1
- общая библиотека
- модуль-библиотека (узел зависит от
shared-library
)
рабочая область2
- основное приложение (зависит от
module-library
иshared-library
)
Теперь зависимости для проектов рабочей области определены в
tsconfig.base.json
файл под
compilerOptions.paths
.
Однако для рабочей области 2, которая не связана с рабочей областью 1, я устанавливаю пакеты (как через
file:
. Когда я тогда построю
main-app
Я получаю сообщение об ошибке
module-library
не может найти
shared-library
(даже если он установлен в workspace2.
Мне пришлось добавить
./../workspace1/dist/shared-library
к
compilerOptions.paths
в
tsconfig.base.json
of workspace2 (обратите внимание на ссылку на workspace1).
Это, очевидно, объединяет рабочие области в моей файловой системе. Но для целей разработки это идеально.