如何将Lerna Monorepo各子包公共devDependencies提取到根package.json
解决方案
Lerna 本身没有提供自动提取公共依赖到根目录 package.json、同时删除子包对应依赖声明的专用命令。你用到的 lerna bootstrap --hoist 仅会将重复的依赖提升到根目录的 node_modules 中安装,避免重复下载,并不会修改任何子包的 package.json 配置。
要实现你需要的效果,按以下步骤操作即可:
- 先将公共依赖安装到根目录
在项目根目录执行以下命令,将你需要的公共 devDependencies 安装到根package.json:
npm install -D @types/jest@^26.0.24 jest@^27.0.6 ts-jest@^27.0.4 ts-node@^9.1.1 typescript@^4.3.5
执行完成后根目录的 package.json 就会自动更新为你期望的配置。
- 手动删除子包中的重复依赖声明
分别修改两个子包的package.json:
packages/redux-saga-examples/package.json的devDependencies中删除@types/jest、jest、ts-jest、ts-node、typescript字段,只保留子包独有的依赖packages/redux-toolkit-example/package.json的devDependencies中同样删除上述公共依赖字段,保留子包独有的依赖
- 重新执行bootstrap命令
在根目录执行:
lerna bootstrap --hoist
执行完成后,所有依赖都会正确安装,公共依赖仅在根目录保留一份,子包运行时 Node 的模块解析机制会自动向上查找根目录 node_modules 下的依赖,不会出现找不到包的问题。
补充说明:如果你使用的是 Lerna v6 及以上版本,可以配合 lerna add 命令的全局安装参数,不过核心逻辑依然需要手动移除子包内的重复依赖声明,Lerna 原生不会自动修改子包的配置文件。
内容的提问来源于stack exchange,提问作者Lin Du
相关产品推荐
相关产品推荐

