什么是 monorepo 工作流程?每次我更新公共组件库时,我都必须更新它依赖的其他地方。这是正常的吗?

What is the monorepo work flow? Every time I update the common components lib, I have to update other place where has it dependency. Is this normal?

案例步骤:

  1. 我有packages/commonpackages/react-A这2个子项目packages
  2. react-A 具有依赖项 common@1.0.0
  3. 我将 common 从 v1.0.0 升级到 v2.0.0,并做了很多更改。
  4. react-A 会显示错误,因为它的依赖项也会更新。

每次我升级我的 common 库进行重大更改时,我必须修复它依赖的其他地方,这是正常的方式吗?

TL;DR - 是的,改变 visible / API在许多人之间共享的共同依赖代码将迫使您在不同项目中遵守这些更改。这是预期的。


What is the monorepo work flow?

Monorepo 是一个版本控制的代码存储库,其中包含许多项目。尽管这些项目可能相关,但它们通常在逻辑上是独立的,并且 运行 由不同的团队负责。

工作流程包括(但不限于)以下内容:

  • 大规模提交 - 可能会或可能不会同时影响多个独立项目的提交。
  • 代码可见性 - 项目可以看到其他项目的代码。
  • 共享提交历史 - 影响多个项目的提交应该是可见的。

还有更多的东西。因此,工作流是在单个历史树下管理多个项目。 你如何 是团队特定的...


我认为有很棒的在线资源和博客文章非常详细地描述了什么是 monorepo,所以我不会深入讨论,因为我认为这不是 的本质 的问题。您是拥有一个 monorepo 还是只有一个包含几个子模块的项目,由您决定,因为 monorepo 更像是一个概念而不是实际的物理事物(我在这里相当轻松地接受定义)。

但我认为你的问题与 monorepo 工作流程关系不大,而与一般软件设计有关。

您有一个 common 图书馆。该库可能有也可能没有其他人会使用的 API。该库的 API 可能会随时间改变,也可能不会改变。如果您可以控制 API 的更改方式,那么很明显,如果您更改 API, 每个与该库集成的 都必须符合新的API.

如果 commonv1 有一组特定的方法签名来指示 API 和 commonv2 的变化 这些签名,那么从v1迁移到v2的用户必须改变他们使用common的方式。从根本上说,这与您在内部重构代码或只是更改自己项目的功能没有什么不同。 现在,如果这种方法对您没有吸引力,并且您希望具有向后兼容性和稳定性API,那么有特定的软件工程方法来确保这种稳定性和灵活性,但最重要的是,这是您必须付出的努力,这样实施更改就不会影响您 API,这将 affect/not 影响您的其他项目。

还有一些很棒的工具,例如 Lerna,可以更轻松地管理相关项目之间依赖项的更新。

Material Web Components 存储库是一个有用的示例,说明如何做到这一点(https://github.com/material-components/material-web),Lerna 提供了让 monorepo 中的每个包维护其自己的版本编号或一致地对它们进行版本控制。

到目前为止,我更喜欢第一个选项,因为根据 SemVer 标准,对一个包的重大更改不一定会在另一个包中产生重大更改,因为依赖项中的重大更改可能已由依赖包处理内部。