使用Lerna添加多包时提示“No packages found where graphql can be added”求助
我来帮你分析下这个问题,你遇到的情况其实是Lerna add命令的常见坑,咱们一步步拆解:
一、为什么这次Lerna add会报错?
你之前执行lerna add @types/express --dev能成功,大概率是因为你隐含指定了目标包——要么是当时加了--scope server参数(只是可能你没特意留意),要么是执行命令时的工作目录正好在server包里面。而这次的命令没有明确告诉Lerna要把这些依赖加到哪个包,或者Lerna没法自动识别到合适的包,就抛出了这个警告。
具体来说,可能的原因和解决办法有这几个:
1. 未明确指定目标包(最常见)
Lerna的add命令如果不指定范围,默认会尝试把依赖加到所有packages下的包,但如果你的项目里有些包不需要这些依赖,或者Lerna没找到合适的包,就会报错。你只需要加上--scope参数明确指定server包就行:
lerna add graphql class-validator type-graphql --scope server
如果要加到多个包,用逗号分隔包名就行:--scope package1,package2
2. Lerna的packages配置有问题
检查下项目根目录的lerna.json文件,确认packages字段包含了你的server包路径。比如如果你的server是根目录下的独立文件夹,配置应该像这样:
{ "packages": [ "packages/*", "server" ], "version": "independent" }
要是路径配错了,Lerna找不到对应的包,自然会报“找不到可添加的包”的错误。
3. 包名拼写错误
虽然可能性不高,但可以快速核对下graphql、class-validator、type-graphql这些包名有没有打错字,毕竟拼写错误也会导致Lerna找不到对应包。
二、改用yarn add会不会搞乱依赖树?
放心,只要操作正确,完全不会有问题:
- 如果你是进入server包的目录后执行
yarn add graphql class-validator type-graphql,效果和用Lerna add指定--scope server是完全一致的——这些依赖会被正确添加到server包的package.json的dependencies里,根目录的锁文件(yarn.lock或package-lock.json)也会同步更新,保证整个monorepo的版本一致性。 - 要是你用了Lerna默认的hoist模式(依赖提升),不管是用Lerna add还是yarn add,公共依赖都会被提升到根目录的
node_modules,依赖树结构不会乱。
唯一要注意的是:别在项目根目录直接执行yarn add,否则这些依赖会被加到根目录的package.json里,变成整个项目的全局依赖(除非你确实需要在根目录使用这些包)。
总的来说,两种方式都能保证依赖树正确,但更推荐用Lerna add命令,因为它更适配monorepo的管理逻辑,能避免一些手动操作的小失误。
内容的提问来源于stack exchange,提问作者Amir Meyari

