是什么

单仓:指Monorepo,或单一仓库,是指将多个项目放在同个仓库中的版本控制策略。单仓在实践中可能有不同规模,如中心级、部门级、BG 级、公司级单仓。业界最著名的单仓是Google 的 google3,除一些开源项目,Google 内其它所有代码都放置于其中,有超过 20 亿行代码和超过 86T 的容量。目前公司内部成功应用的单仓大多在部门级及以下。

大仓:指大型规模的仓库。“大型规模”并没有严格的定义 — 在本文中,我们将大仓定义为“单机已无法承受其容量的仓库”。一个粗略的估计:大于五千万行代码 或 容量超过 100G 的仓库即为普遍认可的大仓。

单仓,大仓的对立面是多仓,小仓。

好处

  1. 一致性,标准化。一样的构建流程,开发规范,第三方库依赖等。减少重复造轮子。
  2. 广泛的代码共享和重用。
    1. 基础设施的复用(CI,CD) ,一些业务组件的复用。代码之间可以互相引用。
    2. 有改动,只需改一处。

挑战

  1. 基础设施的提升。
    1. 100G 以上的仓库,拉取,推送代码的速度能接受。
    2. 保密代码构建系统。一些重要的算法、策略等,这部分代码不开放给所有的人。但是我们不希望把这些代码编译成库放到代码库里,这不但可能导致二进制兼容问题(我们的基础库只保证源代码兼容不保证二进制兼容),而且还会成为编译器升级的障碍,并增加代码丢失的风险。因此我们把这些代码放在多个分散权限控制的仓库里,并且通过保密代码构建系统在有专用的服务器上用专用账号构建这些代码,并返回二进制的构建结果。
  2. 对代码的质量要求和代码保障要求高。大仓中的公共代码,会被很多地方引用。如果发生了问题,会影响的地方也很多。一般做法:
    1. 单元测试。
    2. 持续集成。
    3. Code Review。
  3. 从多仓到大仓的迁移的过程。
  4. 将哪些仓合成一个大仓的标准。

工具

文章