如何在 monorepo 中对产品进行版本控制?
Posted
技术标签:
【中文标题】如何在 monorepo 中对产品进行版本控制?【英文标题】:How to version products inside monorepo? 【发布时间】:2018-04-23 20:26:17 【问题描述】:我一直在对自己进行有关 monorepos 的教育,因为我相信它对于我的团队和我们项目的当前状态来说是一个很好的解决方案。我们有多个网络产品(客户端门户、内部门户、API、核心共享代码)。
我正在努力寻找我想要找到的答案的地方是版本控制。
当您的所有项目和产品都在一个 monorepo 中时,版本控制策略是什么?
1 个版本适合所有人? 具有独立版本控制的 Git 子模块(有点打破了拥有单一存储库的点) 其他策略?从 CI 的角度来看,当您在项目 A 中提交某些内容时,您是否应该在所有项目中启动整套测试以确保没有任何问题发生,即使没有必要对依赖项进行更改/分享模块?
【问题讨论】:
您应该清楚地提及您使用的 VCS(看起来像 git)以及您使用的构建工具。还有您使用哪种发布工作流程。 1中的2个问题也不适合***。 【参考方案1】:当您的所有项目和产品都在一个单一存储库中时,版本控制策略是什么?
出于以下原因,我建议一个版本适合所有情况:
例如,在发布产品时,您可以将整个分支标记为release-x.x.x
。如果出现错误,您无需检查“XXX 的哪个版本是 YYY 使用的”
还可以更轻松地强制 XXX 的 x.x.x 版本使用 YYY 的 x.x.x 版本。从本质上讲,使您的项目保持同步。当然,你如何处理这取决于你的项目是用什么技术编写的。
从 CI 的角度来看,当您在项目 A 中提交某些内容时,您是否应该在所有项目中启动整套测试以确保没有任何问题发生,即使没有必要对依赖项进行更改/共享模块?
如果测试不需要特别长的时间来执行,这不会造成任何伤害。我肯定会推荐这个。您的测试运行得越频繁,您就能越早发现与时间相关或与环境相关的错误。
如果您出于某种原因不想一直运行测试,您可以查询您的 VCS 并编写一个脚本,该脚本根据已更改的内容有条件地触发测试。这在很大程度上依赖于 VCS 和 CI 服务器之间的集成。
【讨论】:
这个答案做了一个根深蒂固的假设,即 monorepo 中的所有项目都相互关联。这里的担忧是由诸如 XXX 是否使用 YYY 的 x.x.x 版本之类的问题驱动的?如果 monorepo 中的代码子段在逻辑上彼此无关,并且子项目的一个沿袭的版本控制不应该与另一个沿袭的版本控制相关联,则会出现非常不同的问题。 例如,假设有人将 PostgreSQL 和 TensorFlow 的所有源代码放在同一个 repo 中。每次 PostgreSQL 需要一个新版本时,现在 TensorFlow 也需要一个无操作版本,没有任何变化,但它必须增加其版本才能为整个 repo 保留一个整体版本?基于发布标签自动生成的变更说明将成为一个巨大的 PITA。现在假设您还将所有 Keras 源代码添加到同一个 repo 中,这样给定版本的 Keras 使用哪个版本的 TensorFlow 真的很重要,但与 Postgres 的版本无关。 @Ely 您的解决方案如何?您正在谈论的场景正是我想要解决的问题。单一版本中用于不同应用程序的单一版本没有意义。 嘿@PaulT,你最终做了什么来允许在一个monorepo中为不相关的项目提供不同的版本? 我正在使用 Lerna 来管理我的 monorepo,这只会在项目内部(或其依赖项内部)发生变化时增加项目的版本号。这对我来说效果很好,尽管我的 monorepo 目前仍处于小规模。以上是关于如何在 monorepo 中对产品进行版本控制?的主要内容,如果未能解决你的问题,请参考以下文章
在 Doctrine (symfony2) 中对可翻译实体进行版本控制