Yarn Workspace子包中tsc命令找不到的原因解析
Yarn 3子包无法继承父包devDependencies的原因
场景还原
根目录package.json配置:
{ "scripts": { "compile": "tsc --build", }, "devDependencies": { "typescript": "^4.8.4" } }
packages/foo子包package.json配置:
{ "scripts": { "compile": "tsc --build" }, "devDependencies": { } }
在根目录执行yarn compile可正常编译,但进入packages/foo执行yarn compile时提示command not found: tsc,只有给子包添加typescript依赖后才能正常运行。
核心原因
Yarn 3的monorepo工作区采用依赖隔离设计,父包与子包的依赖环境相互独立,具体细节:
- 子包是独立项目单元:Yarn 3把每个子包当作独立的项目看待,父包的
devDependencies仅作用于根目录,不会自动被子包继承。子包只会使用自身package.json中声明的依赖。 - 脚本执行的路径规则:在子包目录执行脚本时,Yarn会优先查找子包本地
node_modules/.bin下的可执行命令。由于子包没声明typescript,自然找不到tsc;而根目录执行时,会使用根目录node_modules/.bin里的tsc,所以能正常运行。 - 依赖共享需显式配置:Yarn 3不默认开启跨包依赖共享,若要让子包复用父包的依赖,需要手动配置:
- 子包通过
peerDependencies声明typescript依赖,由根目录统一安装管理; - 从根目录执行子包脚本:
yarn workspace packages/foo compile,此时会复用根目录的依赖环境; - 部分Yarn版本可通过
workspaceDependencies字段指定共享的根依赖。
- 子包通过
内容的提问来源于stack exchange,提问作者Trevor Allred
相关产品推荐
相关产品推荐

