Monorepos 目前在前端开发中非常热门。Monorepos 是一个包含多个独立项目的仓库,这些项目之间有明确的关联关系。如果这些项目之间没有明确的关联关系但是存放在同一个仓库的话,这个仓库并不能称为 Monorepos,这只不过是一个大仓库而已。而与 Monorepos 对应的是 Polyrepo,Polyrepo 将不同项目或者不同的模块存储在多个独立的仓库中。

Polyrepo

Polyrepo 是个当前软件开发的标准方式,每个项目保存在独立的仓库中。

优点:

  • 有很好的独立性和隔离性,仓库独立自治。每个仓库可以独立进行开发、测试、部署。
  • 提高并行开发效率和扩展性。不同团队或开发者可以同时在不同的仓库上进行工作互不干扰。
  • 构建和部署十分灵活。由于每个仓库仅负责自己的构建和部署,因此能有效减少构建时间和降低部署的复杂性。

虽然 Polyrepo 有独立自治的特性,但是这个特性会降低团队的协作效率。具体缺点如下:

  • 代码共享相对繁琐。由于是独立的仓库,如果想要共享代码,就需要配置工具、配置 CI/CD。
  • 共享库的变更成本高昂。如果共享库有严重的 bug,当共享库修复之后,还需要对依赖共享库的项目进行依赖升级,然后还需要安排发布。
  • 大量的代码重复。弄共享库比较麻烦,因此各个团队为了图方便都会将功能类似的服务或者组件写在自己的仓库,随着后期服务或者组件的变化,维护成本、安全与质量控制负担越来越重。
  • 工具不统一。每个项目的测试、构建、打包、发布都是个弄个的。

Monorepo

Monorepo 可以很好地解决 Polyrepo 的缺点:

  • 创建新项目的成本较低。新项目可复用之前配好的 CI/CD 配置。
  • 简化依赖管理。由于所有代码都在同一个仓库中,依赖关系更容易管理和跟踪。
  • 跨模块协作更容易。开发者可以更轻松地进行模块之间的协作、重构和调试。
  • 更好的代码复用。模块之间的代码共享更容易,减少了冗余代码的存在。
  • 修复问题的成本较低。同一个 commit 可以修复所有项目的问题,无须担心共享库 breaking change 的问题。

Monorepo 的缺点:

  • 没法对项目做权限管理。由于所有项目都是放在同一个仓库,因此没法对不同的项目做权限管理。
  • 构建和部署时间增加。
  • 并行开发有限制。不同团队或开发者的并行开发受限制,需要更多的协调和合并工作。

工具

  • pnpm: 内置了对 Monorepo 的支持。
  • Changesets: Monorepo 场景下的版本与变更日志管理工具

参考资料