单仓构建工具是干什么的
用依赖图驱动「只构建受影响目标」:affected 概念配合远程缓存,把单仓的全量构建变成增量构建。Nx 面向 JS/TS 为主并带多语言插件;Turborepo 专注 JS/TS 且配置轻;Bazel 面向多语言大型仓库,声明式依赖与远程缓存、远程执行是核心能力。三者共同前提是依赖声明准确,隐式依赖会让判定漏跑。
基本信息
| 共同机制 | 依赖图 + affected + 远程缓存 |
|---|---|
| Nx | JS/TS 为主,任务图、affected、远程缓存 |
| Turborepo | JS/TS 生态,任务管道与缓存,配置轻 |
| Bazel | 多语言大型仓库,声明式依赖、远程缓存与执行 |
| 前提 | 依赖声明准确,隐式依赖会导致漏跑 |
典型使用场景
- 只测受影响包:变更范围自动推导测试集合
- 远程缓存复用:同输入任务跨机器直接命中
- 提交前校验:按受影响范围跑检查,缩短反馈
- 依赖图治理:越界依赖及早暴露
- 大型仓库分层:按项目边界推进构建并行
- 缓存命中排查:定位输入变化导致失效的原因
affected 示例
affected 示例
npx nx affected -t test --base=origin/main # 只测受影响项目
npx nx graph # 查看依赖图
turbo run build --filter=...[origin/main] # 按变更范围构建
bazel build //... --remote_cache=grpc://cache:9092 # 走远程缓存工具对照
| 工具 | 生态 | 特点 |
|---|---|---|
| Nx | JS/TS 为主,多语言插件 | 任务图、affected、远程缓存 |
| Turborepo | JS/TS 生态 | 任务管道与缓存,配置轻 |
| Bazel | 多语言大型仓库 | 声明式依赖、远程缓存与执行 |
| 共同点 | 依赖图驱动 | 只跑受影响目标 |
工具先行条件是依赖声明准确:隐式依赖会让 affected 判定漏跑。
缓存键要含环境版本:Node 与工具链版本不同产出就不同,按环境隔离缓存。
先接远程缓存再谈全量迁移:增量计算与跨机器复用的收益在这里。
落地建议
- 新包接入:用脚手架生成依赖声明与任务配置,避免手工遗漏
affected 误报的兜底:关键分支合并前跑一次全量,长期校准判定准确率。
远程缓存要配淘汰策略:否则无限增长,成本随历史累积。