Lerna多包管理项目TypeScript版本不匹配,如何全局统一版本?
解决方案
问题根因
子包的直接/间接依赖中声明了高版本TypeScript,npx 优先调用当前工作目录node_modules/.bin下的tsc,因此会优先用子包内安装的4.5.2版本,而非根目录的4.2.3版本。
可落地的解决步骤
- 第一步:开启Lerna依赖提升,避免TypeScript被重复安装到子包目录
在lerna.json中添加配置,将TypeScript统一提升到根目录node_modules:
后续执行{ "hoist": ["typescript", "typescript/**"] }lerna bootstrap时就不会在子包的node_modules里安装TypeScript。 - 第二步:强制锁死全仓库TypeScript版本
如果你的npm版本≥8.3,在根目录package.json中添加overrides配置,强制所有依赖树中的TypeScript版本统一为4.2.3:
这一步可以从依赖安装源头拦截高版本TypeScript被安装。{ "overrides": { "typescript": "4.2.3" } } - 第三步:修改构建脚本,显式调用根目录的tsc
不需要修改子包的配置,直接调整根目录的构建命令,指定所有子包调用根目录的tsc:
也可以将子包的lerna exec -- ../../node_modules/.bin/tscbuild脚本统一改为"build": "../../node_modules/.bin/tsc",完全规避npx的自动查找逻辑。 - 第四步:Docker构建兜底清理
在Dockerfile的依赖安装步骤后增加一行清理命令,彻底删除所有子包中意外安装的TypeScript:find ./pkg* -name "typescript" -type d -path "*/node_modules/*" | xargs rm -rf
操作验证
清理所有node_modules和缓存后重新执行安装构建:
rm -rf node_modules ./pkg*/node_modules package-lock.json ./pkg*/package-lock.json npm install lerna bootstrap lerna run build
进入子包验证版本:
cd pkg1 && npx tsc -v # 预期输出 Version 4.2.3
内容的提问来源于stack exchange,提问作者ohmygoddess
相关产品推荐
相关产品推荐

