Из-за чего не резолвит либу в монорепе?

Ссылка скопирована
1 ответ

, подскажите, у нас есть монорепа

"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. Подскажите, на что можно обратить внимание или какие мб предложения есть?

68f3bffeb3ae9312644092.jpeg

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь NetOps Ответ

В монорепе с Yarn workspaces резолв зависимости зависит от того, где физически лежит пакет и как настроены hoisting/nohoist/webpack/tsconfig. Если в одном приложении нужна Admiral 1.0, а в другом Admiral 2.0, менеджер пакетов может поднять одну версию в корень, а другую оставить локально. Но сборщик не всегда резолвит так же, как Node.

Сначала проверьте реальное дерево:

yarn why Admiral
node -p "require.resolve('Admiral/package.json')"

yarn why Admiral node -p "require.resolve('Admiral/package.json')"

Запустите команду из папки проблемного приложения:

cd apps/pkb
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, если разным приложениям нужны разные версии.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно