Monorepo 单一代码库
最后更新于:2022-04-02 02:52:34
[TOC]
> [参考](https://xie.infoq.cn/article/4f870ba6a7c8e0fd825295c92)
## 概述
使用同一个代码库管理所有需要相互依赖或关联的代码
**单一代码库的好处**
* **可见性(Visibility)**:每个人都可以看到其他人的代码,这样可以带来更好的协作和跨团队贡献——不同团队的开发人员都可以修复代码中的 bug,而你甚至都不知道这个 bug 的存在。
* **更简单的依赖关系管理(Simpler dependency management)**:共享依赖关系很简单,因为所有模块都托管在同一个存储库中,因此都不需要包管理器。
* **唯一依赖源(Single source of truth)**:每个依赖只有一个版本,意味着没有版本冲突,没有依赖地狱。
* **一致性(Consistency)**:当你把所有代码库放在一个地方时,执行代码质量标准和统一的风格会更容易。
* **共享时间线(Shared timeline)**:API 或共享库的变更会立即被暴露出来,迫使不同团队提前沟通合作,每个人都得努力跟上变化。
* **原子提交(Atomic commits)**:原子提交使大规模重构更容易,开发人员可以在一次提交中更新多个包或项目。
* **隐式 CI(Implicit CI)**:因为所有代码已经统一维护在一个地方,因此可以保证持续集成\[3\]。
* **统一的 CI/CD(Unified CI/CD)**:可以为代码库中的每个项目使用相同的 CI/CD\[4\]部署流程。
* **统一的构建流程(Unified build process)**:代码库中的每个应用程序可以共享一致的构建流程\[5\]。
**单一代码库的缺陷**
* **性能差(Bad performance)**:单一代码库难以扩大规模,像 git blame 这样的命令可能会不合理的花费很长时间执行,IDE 也开始变得缓慢,生产力受到影响,对每个提交测试整个 repo 变得不可行。
* **破坏主线(Broken main/master)**:主线损坏会影响到在单一代码库中工作的每个人,这既可以被看作是灾难,也可以看作是保证测试既可以保持简洁又可以跟上开发的好机会。
* **学习曲线(Learning curve)**:如果代码库包含了许多紧密耦合的项目,那么新成员的学习曲线会更陡峭。
* **大量的数据(Large volumes of data)**:单一代码库每天都要处理大量的数据和提交。
* **所有权(Ownership)**:维护文件的所有权更有挑战性,因为像 Git 或 Mercurial 这样的系统没有内置的目录权限。
* **Code reviews**:通知可能会变得非常嘈杂。例如,GitHub 有有限的通知设置,不适合大量的 pull request 和 code review。
## 相关工具
**第三方工具**
- Bazel:由谷歌发布,部分基于他们自己的构建系统(Blaze)。Bazel 支持多种语言,并支持大规模构建和测试。
- RushJS:微软用于 JavaScript 的可扩展的单一代码库管理器,能够从一个代码库构建和部署多个包。
- Lerna:JavaScript 的单一代码库管理器,可以与 React、Angular 或 Babel 等流行框架集成。
- Yarn workspace:用一个命令在多个地方安装和更新 Node.js 的依赖项。
- ultra-runner:JavaScript 单一代码库管理脚本,支持 Yarn、pnpm 和 Lerna 插件,支持并行构建。
- Monorepo builder:通过单一代码库安装和更新 PHP 包。
**git 管理工具**
- Large File Storage:Git 的开源扩展,为大文件提供了更好的支持。安装了这个扩展,就可以跟踪任何类型的文件,并将它们无缝的上传到云存储中,从而释放代码库的空间,使 push 和 pull 的速度更快。
- Git CODEOWNERS:允许定义哪个团队拥有代码库中的子目录,当有人提交 pull request 或 push 代码到受保护的分支时,代码所有者会自动被要求进行审查。GitHub 和 GitLab 都支持这一特性。
## 管理最佳实践
* 定义一个便于探索的统一的目录组织。
* 维护分支整洁,保持较小的分支,考虑采用基于主干的开发。
* 为每个项目使用固定的依赖项,一次升级所有依赖项,迫使每个项目都跟上依赖项。只为真正的例外情况保留例外。
* 如果正在使用 Git,学习如何使用 shallow clone和 filter-branch来处理大容量代码库。
* 货比三家,寻找像 Bazel 或 Buck 这样的智能构建系统,以加速构建和测试。
* 如果需要限制对某些项目的访问,请使用 CODEOWERS。
* 使用 Semaphore等 CI/CD 云平台来大规模测试和部署应用程序。
';