什么是 Monorepo

今天看到团队有人说项目要迁移为 Monorepo,作为小白的我还是头一次看见这个词,好奇心的驱动下 Google 了一番,才知道原来 Monorepo 不是一种新的技术,而是代码库的一种组织方式。

看到一篇 Perforce 上一篇不错的介绍文章,翻译一下。

原文地址:https://www.perforce.com/blog/vcs/what-monorepo


什么是 Monorepo,你为什么要关心

Monorepo 意思是是单一的资源库,它存储了每个项目的所有代码和以及资源,它使代码共享更容易,甚至使重构代码变得更容易。

Monorepo & Monolith 之间的不同

Monarepo 是一个单一的仓库,而 Monolith 是一个庞大的代码库。

Monarepo 可以用一个 Monolith 管理。但是,一个 Monolith 也可以被分割成多个仓库。同样,一个 Monarepo 也可以用微服务来代替 Monolith。

在本篇博客中,我们将重点介绍 Monorepo。

Monorepo vs. Multirepo

monorepo 将所有的东西都保存在一个版本库中。多仓库(multirepo)通常每个项目都有一个仓库。项目越多,仓库越多。multirepo 也被称为 polyrepo。

那么,哪一个更好呢?你应该把所有的东西都集中在一个仓库里吗?还是应该把它分成多个仓库?

Monorepo通常适合:

1.可见度

使用单一的存储库可以让你看到每个项目的代码和资源,这有助于管理依赖性。

2.协作

单一的存储库让协作变得更容易。因为每个人都可以访问代码、文件和资源。因此,开发人员可以共享和重用资源。

3.速度

使用单一的存储库可以帮助你加速开发。例如,你可以进行原子式的更改(一个动作在多个项目中进行更改)。

Multirepo 通常适合:

1.Git项目

在Git中大规模管理一个 monorepo 是行不通的。随着仓库越来越大,Git 中的monorepo就会成为一个巨大的问题。所以如果你有团队使用Git,最好有多个仓库。

2.开放源码或第三方项目

在一些版本控制系统中,你需要多个仓库来使用开源项目或与第三方团队合作。那么你就可以确保第三方开发人员只能访问他们正在进行的项目。

所以,为何要使用 Monorepo

对许多公司来说,使用 Monorepo 是个好主意。你可以将每个团队的所有源代码(以及其他文件/数字资产)保存在一个存储库中。这使得它更容易与每个人分享。而且它可以帮助你维护一个单一的真实来源。

在任何提交之后,新的代码对所有开发者都是可见的,这有助于避免基于主干的开发中普遍存在的痛苦的合并。

以下是你应该考虑使用 Monorepo 的一些原因。

  • 你想要一个单一的真实来源。
  • 你想轻松地共享和重用代码。
  • 你想要管理依赖关系的可见性(例如,如果你做了一个改变,还有什么会受到影响?
  • 你想进行原子式的变更(例如,一个操作就可以在多个项目中进行变更)。
  • 你希望团队能更多地协作。
  • 你想进行大规模的变更(例如,代码重构)。
  • 如果你决定走 Monorepo 路线,你将会是一个好公司。领先的公司–比如Google–使用的是monorepo。

下面就不翻译了,是推销网站自己的版本控制软件。


另外 CSS Trick 的一篇文章中也介绍了相关的优缺点,归纳的比较全面和客观。

Monorepo的优势(对我们来说)

  • 一环定乾坤。你用 git 拉一个 repo,你就能 100% 跟上其他人的进度,并且拥有一个完整的开发环境。
  • No stray puppies(不知道咋翻译这个😂)。在 GitHub 上,不会出现混乱。您可以针对 monorepo 发起 Pull Request。您可以在 monorepo 上打开 issues。这就避免了分散的活动被丢失。
  • 欢聚一堂。你可以分享代码。在代码库中的任何地方共享实用程序或组件都会特别有用。我们曾尝试过将共享位发布到 npm 上供其他仓库使用的想法,但与将代码放在一起相比,这样的工作流程很不方便。
  • 一起变老。没有老旧和被忽视的repos,因为它只是一个。对于我们这个小团队来说,拥有几十个repos 意味着其中一些 repos 有老旧过时的依赖,有古老版本的 Node,有与其他 repos 不同步的 linting 和格式化规则等等。

Monorepo的缺点(对我们来说)

  • 部署变得棘手。我们最初拆分repos的主要原因是,这些 repos 中的代码需要去到部署到不同的地方。它们可能代表了其他服务器上的一个单独的服务。一个单独的 repo 意味着更容易挂上该服务器/服务特有的东西,比如CI/CD。
邹明远 wechat
欢迎关注我的公众号「嗜码」
请我喝杯快乐水