如何管理多个monorepos

Posted

技术标签:

【中文标题】如何管理多个monorepos【英文标题】:How to manage multiple monorepos 【发布时间】:2021-07-06 16:00:52 【问题描述】:

在我们的项目中,我们在整个公司都使用了多个 monorepos。问题是,我们有例如 monorepo-A 和 monorepo-B 和 monorepo-B 使用来自 monorepo-A 的组件(这是不可更改的)。

例如,同一个团队正在开发 monorepo-A 和 monorepo-B。 Monorepo-B 是具有最终产品(服务器的实际输出、网页)的 monorepo,而 monorepo-A 只是在 monorepo-B 和其他团队使用的其他 monorepos 中使用的多个项目。

问题是,当团队同时开发 monorepo-A 和 monorepo-B 并在 monorepo-A 中更改某些内容时,开发人员需要先部署它才能在 monorepo-B 中进行尝试。

所以yarn link 有一种方法,但这不是很舒服,并且可能与包发生冲突。

有没有更好的方法可以在不发布代码的情况下为本地开发处理这种情况?有一个简单的结构(不是真实的,仅用于演示):

monorepo-a/
   packages/
      components/     (uses types)
      schemas/        (uses types)
      types/
   lerna.json
   package.json
   tsconfig.json

monorepo-b/
   packages/
      web-app/        (uses monorepo-a/packages/components)
      server/         (uses monorepo-a/packages/schemas)
      types/
   lerna.json
   package.json
   tsconfig.json

作为一名开发人员,我想更改 monorepo-A/packages/components 中的某些内容,并能够立即使用它而无需构建 monorepo-b/packages/web-app。但是因为它们不在同一个工作区中,所以我不能在tsconfig.json 中使用paths 或在package.json 中使用workspaces 或来自lerna 的东西。有没有办法甚至不将其发布到本地存储库?

【问题讨论】:

我不知道它如何与 yarn 一起工作,但与 npm 你不能只使用 npm install ../monorepo-a/packages/whatever 吗?这会在你的磁盘上创建一个符号链接,但如果你 gitignore node_modules(我确定你这样做了)应该没问题。 【参考方案1】:

考虑创建一个enterprise NPM registry。它会在您迁移时吸收一些资源,但可能是最具可扩展性的解决方案,因为它允许您使用所有常规 NPM 工具来处理内部依赖项。

这将允许每个 mono repo 发布每个子包,这有助于减少代码库之间的耦合并严格定义每个包的角色。

【讨论】:

以上是关于如何管理多个monorepos的主要内容,如果未能解决你的问题,请参考以下文章

lerna+yarn workspace+monorepo项目的最佳实践

如何在 monorepo 中维护每个模块的自动更改日志?

如何在 monorepo 中成功锁定节点模块依赖项?

2023年 .NET Monorepo 来了

GitHub Cloud Build 与 monorepo 中的多个 cloudbuild.yamls 集成

开源项目都在用 monorepo,但是你知道居然有那么多坑么?