Я создаю монорепозиторий, используя Turborepo, состоящий из нескольких микросервисов Nestjs и шлюза API, который действует как распространитель запросов. В каждом микросервисе Postgres используется как база данных, а Prisma — как ORM. Каждый микросервис имеет свою собственную схему + клиент Prisma, поэтому это не общая схема/клиент.
Мы хотим создать общий пакет для таких вещей, как DTO, а также для типов и сущностей, сгенерированных prisma. Пакет будет общим для всех микросервисов, поэтому, если я экспортирую призму, сгенерированную из микросервисов, в пакет, возникнет циклическая зависимость.
Я новичок в монорепозиториях, поэтому для меня это сложная тема, но я надеюсь, что кто-то здесь, в Stackoverflow, может внести свой вклад по этому вопросу. Ценить это!





У нас есть аналогичное монорепозиторий относительно Prisma и Turborepo. С нашей точки зрения есть два решения, как избежать циклических зависимостей в монорепозитории:
Вместо создания общего пакета для всех DTO, типов и т. д., который должен использоваться всеми пакетами, оставьте DTO, типы и т. д. внутри пакетов, из которых они исходят.
Иногда помогает переосмыслить размеры пакетов. Решением может быть объединение нескольких пакетов в один, если они используют один и тот же общий код. Или разделить пакет на более мелкие, если вам нужно поделиться только небольшой частью пакета.
Если решение 1 невозможно, вы можете добавить дополнительный скрипт сборки, который копирует общий контент из пакетов в общий.
В Turborepo у вас может быть либо глобальный скрипт с префиксом //#, который выполняет эту работу, либо вы можете добавить скрипт в каждый пакет, либо даже и то, и другое:
// turbo.json
{
"$schema": "https://turborepo.org/schema.json",
"pipeline": {
"build": {
"dependsOn": [
"^build",
"extraBuildScriptFromPackages",
"//#extraGlobalBuildScript"
],
// ...
}
}
}
Мы используем решение 2 для сбора всех метаданных из наших пакетов и создания общего пакета метаданных для всего монорепозитория.
Для типов Prisma мы используем смесь решения 1 (для типов prisma) и решения 2 (для результирующих типов graphql).
Мне не удалось найти точный ресурс, демонстрирующий использование Turborepo с prisma в монорепозитории. Вы видели этот пример использования Prisma с Turborepo? github.com/vercel/turbo/tree/main/examples/with-prisma