Использование одноранговых зависимостей с локальными (file:../some-lib) зависимостями

У меня есть монорепо, в котором много микросервисов. Есть некоторые функции / классы библиотечного типа, которые я хочу сделать доступными для любого микросервиса, которому это необходимо. Однако, если этот пакет библиотеки объявляет одноранговую зависимость, одноранговая зависимость не обнаруживается при запуске кода из вещи, которая зависит от библиотеки.

Рассмотрим эту структуру репо:

  • Lib
    • некоторая библиотека (peerDepends on foo)
      • index.js (требуется foo)
      • node_modules будут пустыми
  • Сервисы
    • некоторые услуги (зависит от 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 внутри библиотеки
  • Установите каждую одноранговую зависимость в корне проекта для локальной разработки и тестирования.

Ни один из них не является действительно отличным решением, потому что он не позволяет каждому сервису иметь разные версии зависимостей, и, следовательно, означает, что если локальная версия (или версия библиотеки) зависимости повышается, все службы, которые используют библиотеку затем одновременно повышают версию их зависимостей, что делает их более хрупкими, потому что все они связаны друг с другом.

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).

Это, очевидно, объединяет рабочие области в моей файловой системе. Но для целей разработки это идеально.

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