为何pnpm实际使用的jest版本与package.json声明的不符?
Jest版本冲突导致测试报错(Monorepo + Turborepo + pnpm场景)
问题背景
我的子包package.json中devDependencies配置如下:
"devDependencies": { "typescript": "~4.6.2", "jest": "~27.5.1", "ts-jest": "~27.1.3", "@types/jest": "~27.4.1", "@types/uuid": "~8.3.0" }
运行pnpm run test时出现以下错误:
FAIL test/types/combineModelsByPropertyNameAndType.spec.ts ● Test suite failed to run TypeError: Jest: a transform must export a `process` function. at ScriptTransformer._getTransformer (../../node_modules/.pnpm/@jest+transform@26.6.2/node_modules/@jest/transform/build/ScriptTransformer.js:360:13) at ScriptTransformer.transformSource (../../node_modules/.pnpm/@jest+transform@26.6.2/node_modules/@jest/transform/build/ScriptTransformer.js:427:28) at ScriptTransformer._transformAndBuildScript (../../node_modules/.pnpm/@jest+transform@26.6.2/node_modules/@jest/transform/build/ScriptTransformer.js:569:40) at ScriptTransformer.transform (../../node_modules/.pnpm/@jest+transform@26.6.2/node_modules/@jest/transform/build/ScriptTransformer.js:607:25)
明明声明了Jest 27.x版本,但实际运行时加载的是26.x版本的@jest/transform,这是报错的直接原因。当前使用Turborepo作为monorepo管理工具,仓库内其他子包使用的是Jest 26.x,不确定问题出在pnpm还是Turborepo。
解决方案
1. 强制子包依赖版本(pnpm专属)
在子包的package.json中添加pnpm.overrides字段,强制锁定Jest及其相关依赖的版本,避免被monorepo内其他子包的版本覆盖:
{ "pnpm": { "overrides": { "jest": "~27.5.1", "@jest/transform": "~27.5.1", "ts-jest": "~27.1.3", "@types/jest": "~27.4.1" } } }
2. 配置Turborepo任务隔离
在项目根目录的turbo.json中,为该子包的test任务配置独立的缓存策略,避免共享其他子包的依赖环境:
{ "pipeline": { "test": { "dependsOn": ["^build"], "outputs": [], "env": ["NODE_ENV"], "cache": false // 或者针对该子包单独配置缓存键 } } }
3. 清理缓存并重装依赖
执行以下命令清理pnpm缓存,确保重新安装时拉取正确版本的依赖:
pnpm store prune pnpm install --force
4. 检查根目录依赖配置
如果monorepo根目录有package.json,检查是否全局声明了Jest相关依赖。若存在,要么统一升级到27.x版本,要么删除根目录的Jest依赖,让各个子包独立管理自身依赖版本。
内容的提问来源于stack exchange,提问作者Mike Hogan
相关产品推荐
相关产品推荐

