我们在工作中面临着关于在嵌入式项目中使用子模块来实现可重用代码的相互冲突的观点。
我不知道该怎么想,这不是我们第一次进行这样的讨论,感觉就像我们在兜圈子(历史重演)。
我需要更好地了解 git 子模块的预期用途、它们的优点和缺点,以便就我们应该做什么做出明智的决定。
现在,我们正在自己的存储库中对“核心”(例如音频处理库、无线库等)进行版本控制。这些内核在许多独立项目中重复使用,在许多独立的硬件平台上运行。这些硬件平台 BSP 也在其自己的存储库中独立进行版本控制。各种硬件组件的通用驱动程序也是如此。所有这些组件都在独立项目中重用,其中一些组件(主要是“核心”)的开发进度非常快且风险很大;重大变化是这些的标准。
简而言之,我们使用子模块来:
Git 子模块代表了一种以明确定义的方式组合多个存储库内容的方法。这是一种技术解决方案,一旦您决定在不同的存储库(或分支)中维护代码,您就可以使用它。 所以,
您要问的基本问题是:您想使用单个“monorepo”还是“polyrepo”设置?这两个概念备受争议,每个概念都有自己的优点和缺点,我的建议是你仔细看看什么最适合你的情况。
有两个关键点
使维护代码更改变得非常容易,否则这些代码将驻留在不同的位置(例如,您的应用程序使用驱动程序的新功能)。缺点是,单一存储库在技术上要求更高(存储库更大,建立高效的 CI 管道可能很棘手)。
设置(例如,使用子模块)使用起来更复杂(如开发人员所述)。将东西放在不同的地方意味着您需要一个好的解决方案来将来自不同来源的“匹配”代码组合在一起。然而,它在技术上要求不高,而且为每个组件设置 CI 也很简单。