Monorepo 与 Polyrepo

2025-06-08

Monorepo 与 Polyrepo

随着微服务、微前端和微应用等微架构模式的流行,是否将代码库维护为 monorepo 或 polyrepo 的问题变得更加令人困惑。

一方面,单一仓库非常适合跨项目代码共享、依赖项管理以及代码库的一致性。另一方面,多仓库在管理项目、依赖项和发布方面提供了更大的灵活性,并赋予团队独立工作所需的自主权。

从某种程度上来说,多仓库是微架构设计更“自然”的方法,因为它让我们能够享受小型、简单和自主项目的优势,而无需承担单一仓库的复杂性。然而,多仓库也带来了一系列挑战,尤其是在管理依赖关系和确保整个代码库的一致性方面。

兼具两者优点的解决方案

显然,我们需要一种能够兼具两者优势的解决方案:多仓库的简单性和自主性,以及单一仓库的代码共享和一致性。Bit 正是为此而。Bit 允许您将代码库的每个组件作为独立实体进行管理,称为“Bit 组件”。

Bit 可以集成到现有的 monorepos 或 polyrepos 中,或者可以用来以完全分散的方式管理您的代码库,而无需存储库。

第一种方法将您的存储库转换为细粒度的单一存储库,或可组合的存储库/代码库。第二种方法完全不再需要存储库,因为 Bit 组件可以独立地进行修改、构建、版本控制和共享,而无需与任何存储库耦合。

从单一仓库到可组合仓库,最终到完全去中心化

点击此处查看高分辨率图表

可组合代码库:最大化代码重用并简化项目维护

要理解可组合代码库的工作原理,我们首先来看看 Monorepo 中的项目结构。Monorepo 通常托管两种类型的项目:库和应用(包含“服务”)。库是可复用的代码片段,可在多个应用之间共享;而应用则是使用这些库(及其他依赖项)的独立项目。

可组合设计中库和应用程序之间没有区别

另一方面,可组合代码库仅由 Bit 组件组成。Bit 组件既是一个库,也可能是一个应用程序(即可部署的组件)。与单一仓库的常见结构不同,由 Bit 组件组成的仓库将具有简单的“扁平”结构,类似于任何其他可组合设计。

标准应用程序/服务 NodeJS 库 位组件
发布到 NodeJS 注册表 不。 是的。 是的。Bit组件会发布到 Bit 平台,也可能发布到其他注册中心,例如 NPM 注册中心。这包括可部署组件或“应用组件”。Bit 组件可以作为标准 NodeJS 包安装。
可部署 是的。 不。 是的。虽然所有 Bit 组件都已发布到 NodeJS 注册表,但有些组件也可以配置为部署。
真相之源 项目级 VCS 和 VCS 平台,如 Git 和 Github。 项目级 VCS 和 VCS 平台。 要么是“Bit 范围”和像 Bit Platform 这样的平台,要么是项目级 VCS 和 VCS 平台。
组件特定的开发设置和依赖项 不可以。开发工具和配置以及依赖项都是在整个存储库或其子目录中配置的。 不可以。开发工具和配置以及依赖项都是在整个存储库或其子目录中配置的。 是的。每个 Bit 组件都可以拥有自己的开发设置和依赖项,完全独立于其当前存储库或其在存储库中的位置。开发环境/设置将作为 Bit 组件进行维护,并可跨项目供其他 Bit 组件复用。

每个 Bit 组件在其自己的目录中都有其源文件,并且有一个单独的文件作为其入口点或“主”文件。每个 Bit 组件通过其在node_modules目录中的符号链接/已安装实例来使用其他 Bit 组件。例如:



# An example of a composable repo

button/
    index.ts
    button.ts
my-app/
    my-app.ts
    my-app.bit-app.ts (defines 'my-app' as a deployable app component)
    index.ts
node_modules/
    @my-scope/button/
      index.js -> (symlink for type support and IntelliSense)
      button.js -> (symlink) ../../button/button.ts
      dist/
        index.js (compiled)
        button.js (compiled)
    @my-scope/my-app/
      index.js -> (symlink) ../../my-app/dist/index.ts
      my-app.js -> (symlink) ../../my-app/my-app.ts
      dist/
        index.js (compiled)
        my-app.js (compiled)


Enter fullscreen mode Exit fullscreen mode

可组合代码库中的库和应用之间没有结构上的区别。每个 Bit 组件都可以被其他 Bit 组件使用,并且也可以使用其他 Bit 组件,无论其类型如何。

这极大地简化了您的项目维护和管理。您可以轻松了解组件之间的关系、管理依赖关系并确保整个代码库的一致性。

此外,代码库中的每个功能(不仅仅是实用函数和基本的 UI 元素)都是独立的实体,可以独立共享、版本控制和更新。最棒的是,它不需要额外的开销或复杂性。您的代码“自然”可共享、可重用,甚至可移植。

代码共享和重用的常见问题和挑战不再是问题,因为 Bit 会处理所有问题,包括:依赖项、文档、构建、测试、版本控制,甚至 CI/CD。

分散的代码库:提高团队自主性和代码库灵活性

当 Bit 范围作为组件真实来源时的协作

去中心化代码库并非由单一代码库管理,而是分布在多个代码库中,甚至没有代码库。如上表所述,使用 Bit 组件时,您可以决定其真实来源。它可以是托管在 GitHub、GitLab 或 Bitbucket 等平台上的项目级代码库,也可以是托管在 Bit 平台上的单个组件。

根据团队的工作流程结构,您可以选择可信来源:托管组件的 Bit 作用域或维护组件的项目存储库。选择 Bit 作用域作为可信来源,可以让您对每个组件进行细粒度的访问控制和构建设置,并在管理代码库方面获得无与伦比的灵活性。

可以创建和销毁存储库,可以移动组件,并且您可以根据团队或组织的工作流程和项目的要求决定在哪里维护它们。

在完全去中心化的代码库中,存储库被用作一次性工具

鏂囩珷鏉ユ簮锛�https://dev.to/bitdev_/monorepo-vs-polyrepo-j9
PREV
用 Elixir 的方式编写 Rust
NEXT
我的 Go 工具包用于构建无框架应用程序 Gin Web 框架 ⚡ zap UUID 此存储库不再维护 jwt-go Testify - 你必须编写测试 YAML 支持 Go 语言 gomock 安装