Monorepo 决策 = 集中化 vs 分散化
解决什么问题:代码组织方式影响协作模式—— Monorepo = 单仓库 = 集中化优势;Multi-repo = 多仓库 = 分散化自主。
业务问题
真实场景
场景 1:Monorepo 成功案例
Google / Meta / Microsoft:
- 单仓库
- 数十万工程师
- 跨项目原子变更
- 统一工具链(Bazel)场景 2:Multi-repo 成功案例
Linux kernel / Kubernetes:
- 多仓库
- 独立发布周期
- 独立治理
- 轻量级协作Monorepo vs Multi-repo
| 维度 | Monorepo | Multi-repo |
|---|---|---|
| 跨项目变更 | 原子性 | 多个 PR |
| 代码搜索 | 一次查询 | 多个仓库 |
| 依赖管理 | 统一版本 | 各自维护 |
| CI/CD | 集中 | 分散 |
| 仓库大小 | PB 级 | GB 级 |
| 团队自治 | 弱 | 强 |
| 适合 | 大型组织 | 独立项目 |
Trunk-Based Development
特点:
- 单一主干(trunk)
- 短分支(< 1 天)
- 持续集成
- Feature flags 替代长分支vs Git Flow:
- 多分支(develop / feature / release)
- 合并冲突多
- 集成延迟
工程实践
决策树
决策:
1. 团队规模 > 100?
- 是 → 考虑 Monorepo
- 否 → Multi-repo
2. 项目耦合度高?
- 是 → Monorepo
- 否 → Multi-repo
3. 跨项目重构频繁?
- 是 → Monorepo
4. 工具链能支持?
- 是 → Monorepo
- 否 → Multi-repo工具支持
| 工具 | 适用 |
|---|---|
| Bazel | Monorepo(Google) |
| Pants | Monorepo(Twitter) |
| Nx | Monorepo(Nrwl) |
| Turborepo | 中型 Monorepo |
| Lerna | JavaScript Monorepo |
与 L 层对位
关键洞察
- Monorepo ≠ 永远更好——是 trade-off。
- 工具链决定 Monorepo 可行性——没有 Bazel 等价物别试。
- Feature flags 替代分支——Trunk-based 的关键。
- Conway 定律——代码组织反映组织结构。
- 与 cybernetics 同构——Ch 21 多级分散 = Multi-repo;Ch 4 §4.6 中央协调 = Monorepo。