我正在使用Turborepo创建一个monorepo,它由多个Nestjs微服务和一个作为请求分发器的API网关组成。在每个微型服务中,Postgres被用作数据库,Prisma用作ORM。每个微服务都有自己的模式+ Prisma客户机,因此它不是共享模式/客户机。
我们希望为DTO以及prisma生成的类型和实体创建一个共享包。包将在所有微服务之间共享,因此如果我将从微服务生成的prisma导出到包中,则会出现循环依赖关系。
我对monorepos还不熟悉,所以这对我来说是一个复杂的话题,但我希望Stackoverflow上的人可能会在这个问题上有一些意见。很感激你!
发布于 2022-12-03 08:25:36
关于普里斯马和图尔博列波,我们也有类似的独舞。从我们的观点来看,有两种解决方案可以避免在monorepo中循环依赖:
1.避免
不要为所有的DTO、类型等创建一个共享的包,而是将DTO、类型等保留在它们来自的包中。
有时,它有助于重新考虑包装的大小。如果某些包使用相同的共享代码,则可以将它们合并为一个包。或者将包分成更小的包,如果您只需要共享包的一小部分的话。
2.通过额外的构建脚本来打破循环依赖关系
如果解决方案1不可能,您可以添加一个额外的构建脚本,将共享内容从包复制到共享的包中。在Turborepo中,您可以使用以//#作为前缀的全局脚本来完成任务,也可以将脚本添加到每个包中,甚至两者都添加:
// turbo.json
{
"$schema": "https://turborepo.org/schema.json",
"pipeline": {
"build": {
"dependsOn": [
"^build",
"extraBuildScriptFromPackages",
"//#extraGlobalBuildScript"
],
// ...
}
}
}我们使用解决方案2从包中收集所有元数据,并为整个monorepo创建一个共享元数据包。
对于Prisma类型,我们使用解决方案1( prisma类型)和解决方案2(结果的graphql类型)的混合。
https://stackoverflow.com/questions/74529773
复制相似问题