Turborepo/Monorepo中多Jest版本隔离问题求助
在Turborepo中实现子包独立使用不同版本Jest
问题场景
我有一个Turborepo项目,目录结构如下:
- apps
- libs
- package1
- package.json
- package2
- package.json
- package1
- package.json
尝试将libs下的子包逐个升级Jest版本,希望让package1使用新版Jest,同时保留package2的旧版Jest。试过overrides、resolutions、nohoist、workspaces等配置,运行yarn test时脚本输出的Jest版本显示正确,但测试失败表现和版本不匹配的情况一致。
解决步骤
1. 为子包单独安装对应版本Jest
在项目根目录执行命令,分别给两个子包安装目标版本的Jest:
yarn workspace package1 add jest@<新版本号> --dev yarn workspace package2 add jest@<旧版本号> --dev
确保两个子包的package.json中,devDependencies里的Jest版本为各自的目标版本,根目录package.json不要声明Jest的公共版本。
2. 配置Turborepo的nohoist规则
在根目录package.json中添加nohoist配置,阻止Jest相关包被统一hoist到根目录:
{ "workspaces": { "packages": ["apps/*", "libs/*"], "nohoist": [ "**/jest", "**/jest/**" ] } }
这样Yarn会将两个子包的Jest分别安装在各自的node_modules目录下,彻底避免版本冲突。
3. 让子包test脚本调用本地Jest
修改两个子包的package.json中的scripts,明确指定调用本地安装的Jest:
- package1的
package.json:
{ "scripts": { "test": "./node_modules/.bin/jest" } }
- package2的
package.json:
{ "scripts": { "test": "./node_modules/.bin/jest" } }
直接调用本地bin目录的Jest,避免全局或根目录hoist版本的干扰。
4. 清理缓存并重新安装依赖
执行以下命令清理旧依赖和缓存,确保依赖安装完全遵循新配置:
rm -rf node_modules rm yarn.lock yarn install
5. 验证版本与测试运行
分别进入两个子包目录,验证Jest版本:
cd libs/package1 && ./node_modules/.bin/jest --version cd libs/package2 && ./node_modules/.bin/jest --version
确认版本正确后,分别运行测试:
yarn workspace package1 test yarn workspace package2 test
此时两个子包会各自使用对应版本的Jest运行测试,不会互相干扰。
内容的提问来源于stack exchange,提问作者Tim McIntire
相关产品推荐
相关产品推荐

