首页/开发/CI/CD 与发布速查/单仓构建工具概览(Nx / Turborepo / Bazel)
构建与制品管理58 条

单仓构建工具概览(Nx / Turborepo / Bazel)

用依赖图驱动「只构建受影响目标」:affected 概念配合远程缓存,把 monorepo 的全量构建变成增量构建。

CI/CD 与发布速查开发更新于 2026-10-13

单仓构建工具是干什么的

用依赖图驱动「只构建受影响目标」:affected 概念配合远程缓存,把单仓的全量构建变成增量构建。Nx 面向 JS/TS 为主并带多语言插件;Turborepo 专注 JS/TS 且配置轻;Bazel 面向多语言大型仓库,声明式依赖与远程缓存、远程执行是核心能力。三者共同前提是依赖声明准确,隐式依赖会让判定漏跑。

基本信息

共同机制依赖图 + affected + 远程缓存
NxJS/TS 为主,任务图、affected、远程缓存
TurborepoJS/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   # 走远程缓存

工具对照

工具生态特点
NxJS/TS 为主,多语言插件任务图、affected、远程缓存
TurborepoJS/TS 生态任务管道与缓存,配置轻
Bazel多语言大型仓库声明式依赖、远程缓存与执行
共同点依赖图驱动只跑受影响目标
工具先行条件是依赖声明准确:隐式依赖会让 affected 判定漏跑。
缓存键要含环境版本:Node 与工具链版本不同产出就不同,按环境隔离缓存。
先接远程缓存再谈全量迁移:增量计算与跨机器复用的收益在这里。

落地建议

  • 新包接入:用脚手架生成依赖声明与任务配置,避免手工遗漏
affected 误报的兜底:关键分支合并前跑一次全量,长期校准判定准确率。
远程缓存要配淘汰策略:否则无限增长,成本随历史累积。

易错点

  • 依赖图的隐式依赖未声明:改动判定遗漏,定期用全量构建交叉验证
  • 缓存键未含环境版本(Node 版本等):跨环境复用错误结果
  • 全量构建退场过早:迁移期保留夜间全量构建做兜底校验
  • 本地与 CI 工具版本漂移:结果判定不一致,两端固定同一版本

数据来源与参考

  • Nx Docs《Affected》
  • Turborepo 文档
  • Bazel 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌