Skip to content
大纲

Monorepo 包管理方式

什么是 monorepo [ˈmɒnəʊ rɪpoʊ]("mono"表示'single单一','repo'是'repository[rɪˈpɑzəˌtɔri]-存储库'的缩写)是一种软件开发策略,把许多项目的代码存储在同一个存储库中

相当于 一个仓库管理多个包

每次提交时,一切都协同工作。当您在同一个提交中修复所有内容时,没有所谓的重大更改。

polyrepo与monorepo

这两个是对立关系

polyrepo -multirepo 遇到的问题

polyrepo[poli rɪpoʊ]

polyrepo 是当前开发应用程序的标准方式:每个团队、应用程序或项目的 repo。每个 repo 都有一个构建工件和简单的构建管道是很常见的

  1. Costly cross-repo changes to shared libraries and consumers (对共享库和消费者进行代价高昂的跨存储库更改)

    考虑共享库中的严重错误或重大更改:开发人员需要设置他们的环境以将更改应用到具有断开修订历史的多个存储库中。更不用说版本控制和发布包的协调工作了

  2. Cumbersome code sharing (繁琐的代码共享)

    要跨存储库共享代码,您可能会为共享代码创建一个存储库。现在您必须设置工具和 CI 环境,将提交者添加到存储库,并设置包发布,以便其他存储库可以依赖它。让我们不要开始协调跨存储库的第三方库的不兼容版本......

  3. Significant code duplication(明显的重复代码)

    没有人愿意经历设置共享存储库的麻烦,因此团队只需在每个存储库中编写自己的公共服务和组件实现即可。这浪费了前期时间,但随着组件和服务的变化,也增加了维护、安全和质量控制的负担。

  4. Inconsistent tooling (不一致的开发工具) 每个项目都使用自己的一组命令来运行测试、构建、服务、linting、部署等。不一致会产生记忆在项目之间使用哪些命令的心理开销

monorepo 解决的问题

  1. 无需创建新项目的开销(No overhead to create new projects)

    使用现有的 CI 设置,如果所有消费者都在同一个 repo 中,则无需发布版本化包。

  2. 跨项目的原子提交(Atomic commits across projects)

    每次提交时,一切都协同工作。当您在同一个提交中修复所有内容时,没有所谓的重大更改。

  3. 唯一的版本环境(One version of everything)

    由于项目依赖于第三方库的冲突版本,因此无需担心不兼容问题

  4. 开发机动性 (Developer mobility)

    获得一致的方式来构建和测试使用不同工具和技术编写的应用程序。开发人员可以自信地为其他团队的应用程序做出贡献,并验证他们的更改是否安全。

monorepo缺点

  • git仓库体积会变大

相关工具

turborepo

['tebo rɪpoʊ]

JavaScript和Typescript代码库的高性能构建系统

一个类似cli的一个开源项目帮你构建好了monorepo 内部基于 Go 的实现

turborepo

参考文献