Из-за чего не резолвит либу в монорепе?
, подскажите, у нас есть монорепа
"workspaces": { "packages": [ "apps/*", "packages/*" ] }
По вводным: и в разных пакетах разная версия либы
Apps/pkb
{
Admiral: 2.0
}
Apps/opsnext
{
Admiral: 1.0
}
Нужно понять: либы нельзя привести к одной версии, соотвественно yarn одну зависимость хойстит на уровень монорепы, а более высокая находится на уровне пакета pkb. По идее когда я запускаю локально, он должен смотреть в локальных node_modules и после спускаться на уровень монорепы. То есть он должен идти на уровень пакета и брать версию либы admiral 2.0, по сути он всегда забирает ее с уровня монорепы(1.0) и падает соотвественно с ошибкой. Проверял в вебпаке указывать resolve.alias для либы, resolve.modules но эффекта не возымело. Yarn версии 1.2.22, webpack 5.88. Подскажите, на что можно обратить внимание или какие мб предложения есть?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

В монорепе с Yarn workspaces резолв зависимости зависит от того, где физически лежит пакет и как настроены hoisting/nohoist/webpack/tsconfig. Если в одном приложении нужна
Admiral 1.0, а в другомAdmiral 2.0, менеджер пакетов может поднять одну версию в корень, а другую оставить локально. Но сборщик не всегда резолвит так же, как Node.Сначала проверьте реальное дерево:
yarn why Admiral node -p "require.resolve('Admiral/package.json')"
Запустите команду из папки проблемного приложения:
cd apps/pkb node -p "require.resolve('Admiral/package.json')"
Если Node видит правильную версию, а webpack нет, проблема в alias/modules. Проверьте, нет ли alias на корневую версию:
resolve: { alias: { Admiral: path.resolve(__dirname, '../../node_modules/Admiral') } }resolve: { alias: { Admiral: path.resolve(__dirname, '../../node_modules/Admiral') } }
Такой alias заставит все приложения брать одну версию. Лучше убрать alias или направить его на локальный
node_modulesконкретного app.Для TypeScript проверьте
pathsвtsconfig. Он тоже может вести не туда:{ "compilerOptions": { "paths": { "Admiral": ["../../node_modules/Admiral"] } } }{ "compilerOptions": { "paths": { "Admiral": ["../../node_modules/Admiral"] } } }
Итог: сначала выясните, какую версию видит Node из папки приложения, затем сравните с webpack/tsconfig aliases. В монорепе нельзя жёстко алиасить библиотеку на корневой
node_modules, если разным приложениям нужны разные версии.