首页/开发/系统分析与架构设计速查/单仓与多仓(Monorepo / Polyrepo)

单仓与多仓(Monorepo / Polyrepo)

仓库布局影响依赖管理与协作方式:单仓便于跨模块原子提交与统一工具链,多仓便于独立发布与细粒度权限;选择取决于团队规模、构建系统能力与治理成本。

仓库布局影响什么

单仓(Monorepo)把所有模块放在一个版本库里,跨模块改动可以一次提交、一次联合验证;多仓(Polyrepo)让每个模块独立版本化与发布,权限划分更细。选择取决于三件事:跨模块改动有多频繁、构建系统能不能只跑受影响的部分、团队规模是否已经需要独立的发布节奏。仓库布局不是技术洁癖问题,它直接决定依赖协调成本落在哪里。

基本信息

单仓前提受影响分析与远程缓存能力到位,否则 CI 会退化成全量构建
多仓前提包版本化规范与接口契约管理到位,否则依赖协调靠口头同步
成本转移单仓把协调成本变成构建与权限治理;多仓把协调成本变成版本与依赖治理
迁移代价仓库合并或拆分都会打断历史与流水线,属于长期投入

典型使用场景

  • 多服务共享底层库:接口变更需要同步修改多个模块时,单仓能一次提交完成
  • 前端多包项目:设计与组件库联调频繁,单仓可减少版本发布往返
  • 不同团队独立交付:发布节奏差异大时,多仓减少相互阻塞
  • 开源或外包协作:多仓便于按仓库授予权限并控制可见范围
  • 合规隔离要求:不同等级代码需要独立访问控制时,多仓更容易落地

对比

维度单仓(Monorepo)多仓(Polyrepo)
原子提交跨模块一次提交需多次发布协调
构建需受影响分析控制流水线时长各自独立构建
权限仓库级权限较粗,需目录级策略按仓库授权更细
版本管理统一版本,跨模块引用直接需包版本化与依赖协调
发布节奏统一流水线,影响面较大独立发布,节奏灵活

单仓流水线要点

单仓流水线要点
1. 受影响分析:按改动文件推导需要构建与测试的模块
2. 远程缓存:命中未改动模块的构建产物,避免重复编译
3. 分阶段执行:先跑单元测试,再跑集成,失败早停
4. 提交门禁:跨模块改动必须跑覆盖各模块的联合测试
# 没有前两项,单仓的 CI 时长会随代码量线性增长

使用要点

  • 单仓不等于单构建:需要受影响分析与远程缓存才能控制 CI 时长
  • 多仓要建立依赖升级流程:谁负责推动下游升级、多久必须升到某个版本
  • 接口变更无论单仓多仓都要有契约与兼容性检查,仓库布局不能替代契约管理
  • 明确回滚粒度:单仓回滚影响面大,多仓要处理版本兼容矩阵
单仓不等于单构建:需要受影响分析与远程缓存才能控制 CI 时长,工具与流程不到位时会拖慢流水线,反而比多仓更慢。
单仓下的权限是常见盲点:仓库级权限无法表达目录级隔离,涉及敏感配置或第三方代码时,需要额外的目录策略或拆分方案。

易错点

  • 跟风单仓但流水线全量构建,CI 时长随代码量增长,提交等待时间失控
  • 多仓下模块边界模糊,接口变更靠口头同步,下游在升级时才暴露不兼容
  • 单仓权限粒度不足,所有贡献者都能读到全部代码与配置,敏感内容暴露
  • 仓库拆分时未迁移历史与流水线配置,问题排查丢失线索,构建要重新搭建
  • 把仓库布局当成解决协作问题的唯一手段:真正的瓶颈常是接口设计、评审流程与发布纪律

数据来源与参考

  • Potvin & Levenberg:Why Google Stores Billions of Lines of Code in a Single Repository(Communications of the ACM,2016)
  • Microsoft Code With Engineering Playbook:工程实践文档(含仓库策略)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌