Monorepo合并项目时项目启动报错

128 阅读2分钟

使用monorepo时遇到了一个问题

Nest can't resolve dependencies of the MongooseCoreModule (MongooseConnectionName, ?). Please make sure that the argument ModuleRef at index [1] is available in the MongooseCoreModule context

项目在合并前都是运行正常的,但放到一起时其中几个项目突然启动失败了,提示MongooseCoreModule初始化失败,检查是否存在循环依赖。

一开始我以为是mongoose初始化时的数据库配置出问题了,但经过一轮排查后发现项目之间返回的provider是一样的,说明不是这方面的问题。

于是去检查了nest的启动过程,发现在使用nest-core时有两个版本一样但id不同的依赖

image.png

有问题的项目使用的都是上面的依赖,启动正常的使用的都是下面的依赖,点开最外层pnpm-lock.yaml可以看到dependencies里记录的编号确实不一样。

image.png

将dependence里的内容改成正常项目一样的,重新pnpm i,就能正常启动了。

=================== 手动分割线 =====================

本来到这里问题应该就解决了,但实际上还远远没有。

为什么会出现两个版本相同的包?为什么项目中引用的core包会出现不一样的情况?

在debug时,有问题的包会在某个方法直接跳到另一个没有问题的包下面,由此猜测可能和vscode的缓存机制或者pnpm的连接方式有关。

在想到这个问题的时候我找到了这篇文章:pnpm 什么情况下一个版本的依赖会出现两次,里面讲了为什么会同样的依赖一个版本出现两次,简单来说就是pnpm的依赖会被平铺开使用软连接的方式调用,然后由于有些包直接引用了这个依赖,而有些包通过某些其他包间接引用了这个依赖,pnpm为了区分哪个依赖属于哪个包,就会在依赖版本后面加上哈希值。

顺着这个思路继续往下找,发现stack overflow上的一篇文章:同版本不同哈希值的依赖使nestjs崩溃,提问者遇到了和我一样的问题,但没找到答案。

直到写这篇文章,这个问题仍然没有得到解决,但是由于问题的原因是相同依赖之间互相影响,并不会对docker部署产生影响,暂时先搁置一段时间,后续找到更加合适的解决办法再回头补充。