构建系统哲学 = Fast + Correct
解决什么问题:构建慢 + 不一致 = 开发体验差—— Bazel 的核心理念:Fast(增量)+ Correct(确定性)。
业务问题
真实场景
场景 1:构建慢 = 开发慢
- 工程师修改一行代码
- 等待 5-10 分钟构建
- 期间无法测试
- 一天 50 次构建 = 半天等待场景 2:构建不一致 = 调试噩梦
- 工程师 A 构建成功
- 工程师 B 构建失败(同一代码)
- "在我机器上能跑"
- 浪费时间在环境差异Fast + Correct
Fast:
- 一键构建
- 增量构建(只重建改动)
- 远程 cache
- 远程执行
Correct:
- 确定性(同一输入 = 同一输出)
- 沙箱化(无外部依赖)
- 完整依赖图Bazel 核心理念
任务图(Task Graph):
- 自动生成(从 BUILD 文件)
- 增量构建(只重做改动)
- 缓存(远程 + 本地)
- 并行执行
规则(Rules):
- 声明式(不是命令式)
- 可扩展(自定义规则)
- 语言无关远程构建
本地构建瓶颈:
- CPU 限制
- 网络限制
- 缓存限制
远程构建:
- 远程 cache(团队共享)
- 远程执行(大规模并行)
- 类似 Google 的 Borg工程实践
决策 1:何时需要专业构建系统
判断:
- 构建时间 > 5 分钟 → 考虑 Bazel
- 多语言 → 考虑 Bazel
- 团队 > 50 → 考虑 Bazel
- 否则 → 简单工具(Make/Gradle/npm)决策 2:构建系统的关键能力
能力清单:
✓ 增量构建
✓ 远程缓存
✓ 确定性
✓ 依赖图
✓ 并行执行
✓ 跨平台
✓ 多语言与 L 层对位
关键洞察
- Fast + Correct 是构建系统的 2 个核心——不能妥协。
- 确定性比速度重要——错误的速度不可接受。
- 远程缓存是规模化的关键——团队越大收益越大。
- 声明式 > 命令式——依赖图自动管理。
- 与 cybernetics 同构——Ch 4 §4.6 确定性 = 构建的"不变量"。