深入了解代码存储库策略

代码管理策略:单仓与多仓

在软件开发领域,代码的托管与管理是至关重要的一环。Mono-repo(单仓)和 Multi-repo(多仓)是两种主要的策略,它们在 Git 的使用中扮演着关键角色。本文将深入探讨这两种策略的优缺点,帮助您更好地理解它们。

引言

现今,绝大多数的现代项目都依赖 Git 进行管理和托管。Git 已成为全球范围内分布式源代码管理、版本控制以及协作的标准平台。其快速高效的特性使其备受欢迎。在管理 Git 代码时,主要有两种策略:

在详细了解这些策略之前,我们首先要明确 repo(仓库)的概念。

什么是仓库?

仓库(Repo)包含了项目的所有文件夹和文件,同时还包括了用户、团队成员以及计算机的相关信息。

仓库中的数据受版本控制管理。仓库的拥有者可以是个人,也可以是一个团队。

Git 本身就是一个仓库。它可以是公开的、私有的或是内部的。GitHub 是一个提供用户界面的 Git 仓库托管服务。

Git 提供了版本控制和代码共享功能。其独特之处在于,开发人员可以将其本地系统复制整个仓库,从而对文件进行修改。即使开发人员没有特定项目的写入权限,他们也可以在本地复制内容并进行修改(称为“分叉”)。

此外,如果开发人员希望共享其本地更改,可以向项目所有者发送“拉取请求”。

一个项目可以包含一个或多个服务。如果项目具有多个工作流,可以为每个工作流创建多个服务。大多数开发人员倾向于将大型项目分解为更小的独立服务,每个服务负责一个或多个功能。每个服务都旨在解决特定的业务问题。随着无服务器框架的兴起,用户可以将功能作为服务来访问。

当创建并部署这些功能即服务后,下一步就是对其进行结构化和版本控制。这时,可以选择将所有服务放在一个仓库中(单仓),或者为每个服务创建一个单独的仓库(多仓)!

单仓(Mono-repo)

单仓策略指的是将所有服务都存储在单一的存储库中。尽管如此,每个服务仍然可以被独立地部署和管理。这些服务可以共享公共库和代码。

诸如 FacebookGoogle 以及 Dropbox 等公司都在采用单仓策略。

单仓的优势

单仓策略具备以下优势:

  • 项目的所有代码都集中在一个地方,方便团队成员访问。
  • 代码易于重用和共享,促进团队协作。
  • 更容易了解代码变更对整个项目的影响。
  • 代码重构和大规模代码更改的最佳选择。
  • 团队成员可以对整个项目有全面的了解。
  • 易于管理依赖项。

单仓的缺点

当然,单仓也存在一些缺点,其中最主要的是性能问题。随着项目规模的增长,特别是当频繁添加新文件时,签出、拉取等操作速度可能会变慢,文件搜索时间也会增加。

此外,如果项目雇佣了许多独立的承包商,让他们访问整个代码库可能会存在安全风险。

持续部署(CD)的实施也面临挑战,因为多人可以同时提交变更,而持续集成(CI)系统可能需要频繁重建。

为了解决这些扩展性问题,使用单仓的大公司通常会定制开发工具,例如 Facebook 使用自定义文件系统和源代码控制。

多仓(Multi-repo)

多仓策略指的是使用多个仓库来托管项目的多个库和服务。如果某项服务发生更改,开发人员只需重新构建该服务,而无需重新构建整个项目。个人和团队可以专注于各自的服务,并且只能访问他们需要的服务。

NetflixAmazon 等公司都在采用多仓策略。

多仓的优势

选择多仓策略的公司数量远超单仓策略,原因如下:

  • 每个服务和库都有自己的版本控制。
  • 代码签出和拉取操作独立且体积小,即使项目规模增长也不会出现性能问题。
  • 团队可以独立工作,无需访问整个代码库。
  • 开发速度更快,灵活性更高。
  • 每个服务可以独立发布,拥有自己的部署周期,从而简化 CICD 的实施。
  • 更好的访问控制——并非所有团队都需要完全访问所有库,如果需要可以获得读取权限。

多仓的缺点

  • 跨服务和项目使用的依赖项和库必须定期同步,以保持最新版本。
  • 在某些情况下,可能导致各自为政的文化,导致代码重复,以及多个团队试图解决相同的问题。
  • 每个团队可能会为其代码遵循不同的最佳实践,从而导致难以统一遵循共同的最佳实践。

单仓与多仓的区别

下面我们来总结一下单仓和多仓的主要区别:

特性 单仓 (Mono-repo) 多仓 (Multi-repo)
代码组织 一个组织的所有项目的代码都存放在一个中央存储库中。 每个服务和项目都有一个独立的存储库。
团队协作 团队可以协作,并且能看到彼此的变更。 团队可以独立工作,个别变更不会影响其他团队或项目。
访问权限 所有人都可以访问整个项目结构。 管理员可以控制开发人员对项目或服务的访问权限。
性能 项目规模不断增长时,可能会出现扩展性问题。 性能良好,因为代码有限且服务单元较小。
持续部署 难以实施持续部署(CD)和持续集成(CI)。 开发人员可以轻松实现 CDCI,因为他们可以独立构建服务。
代码共享 开发人员可以轻松共享库、API 和其他公共代码,因为它们在一个中央存储库中更新。 对库和其他通用代码的任何更改都应定期同步,以避免后续出现问题。

结论

单仓和多仓都是非常流行的策略,哪一个更优取决于项目的规模、项目需求以及所需要的版本控制和访问控制级别。

单仓强调一致性,而多仓则侧重于解耦。在单仓中,整个团队可以了解到每个人的变更,而多仓则为每个团队创建一个独立的仓库,他们只能访问所需的服务。如果您希望在项目中结合单仓和多仓的优点,可以考虑使用 Meta,这是一款用于管理多个项目和库的工具。

此外,您可能还会对学习 Git 的免费资源感兴趣。