两个Lerna Monorepo跨仓库依赖联动开发问题求助
你遇到的问题核心在于:当被链接的包(比如componentA2)自身存在内部依赖(componentA1)时,Monorepo A内部的相对路径symlink在Monorepo B的环境下会失效。componentA2在A仓库里的node_modules/componentA1是指向同级packages目录的相对链接,但当你把componentA2链接到B仓库后,这个相对路径对B来说是不存在的,所以npm会标记componentA2为invalid。而无内部依赖的componentA1因为不需要依赖其他包,所以能正常工作。
下面给你几个可行的解决方案,按推荐程度排序:
方案一:全局链接链式处理(最稳妥)
这个方法能确保componentA2的内部依赖通过全局链接被正确解析:
先把componentA1注册到全局
进入Monorepo A的packages/componentA1目录,执行:npm link让componentA2依赖全局的componentA1
进入Monorepo A的packages/componentA2目录,执行:npm link @monorepoA/componentA1这一步会把componentA2原本指向Monorepo A内部的相对symlink,替换成指向全局的链接,这样跨仓库使用时就不会有路径问题。
把componentA2也注册到全局
回到Monorepo A的根目录,执行:lerna exec -- npm link确保所有A仓库的包都被全局链接。
在Monorepo B中链接需要的包
进入Monorepo B的根目录,执行:npm link @monorepoA/componentA1 @monorepoA/componentA2此时componentA2会通过全局链接找到它依赖的componentA1,不会再出现invalid的情况。
方案二:使用file路径直接依赖
如果不想用全局链接,可以直接在Monorepo B的package.json(或对应子包的package.json)中添加file路径依赖:
比如在Monorepo B的根package.json中:
"dependencies": { "@monorepoA/componentA1": "file:../path/to/monorepoA/packages/componentA1", "@monorepoA/componentA2": "file:../path/to/monorepoA/packages/componentA2" }
然后执行:
lerna bootstrap
Lerna会自动处理依赖链,确保componentA2能正确找到componentA1的file路径。这种方式的好处是不需要全局操作,缺点是路径是硬编码的,换开发环境时需要调整路径。
验证一下:执行完方案一的步骤后,再在Monorepo B中运行npm ls componentA2,应该会显示正常的链接路径,不再是invalid状态。
内容的提问来源于stack exchange,提问作者kboom

