管理复杂的存储库结构 - 模块依赖关系和共享代码

ein*_*ica 7 version-control mercurial directory-structure subrepos mercurial-subrepos

(以下是我在组织我正在处理的源代码时所遇到的各种复杂性的"理论MCVE".你可以将它视为一个具体的问题而且会很好,或者你可以参考它提出的一般问题并建议如何解决它们.)

假设我有代码A,B,C和D的模块.A取决于B,C,D; B取决于C; C,D不依赖于其他模块.(我松散地使用术语"模块",所以请不要在这里挑剔).

另外,在A,B,C,D的所有部分中,使用了一些相同的头文件,甚至可能是编译对象,将它们组合在一起形成第五个模块是没有意义的,因为它太小了没用 让我们foo.h成为该类别中的一个文件.

虽然所有这些模块都保存在单个整体代码库中,但一切都很好.一切都是一个副本; 在使用相同功能编译的对象之间没有链接器冲突.

在此输入图像描述

问题是:如何将B,C,D中的每一个都放入版本管理的存储库中,以便:

  • 它们中的每一个都可以仅依赖于它所依赖的模块(作为子模块/子存储库或其他方式)来构建; 和
  • 我不需要确保并手动维护/更新相同文件的单独版本,或者从一个库到下一个库进行结转提交(除了可能更改指向的修订版); 和
  • 当所有内容一起构建时(即构建A时),构建不涉及foo.hC的双重副本和C的双重副本(一次用于A,一次用于B) - 我可能总是要确保并保持完全同步.

请注意,当我有更多的时间我会编辑它以使问题更具体(即使我有点像广泛的问题).我会说,在我的具体情况下,代码是现代C++,CUDA,一些bash脚本和CMake模块.因此,面向Java的解决方案是行不通的.

Sha*_*n F 1

简而言之,您可能想要探索工件存储库 (Artifactory) 和依赖项管理解决方案(Ivy、Maven、Gradle)。然后,在构建共享基础模块时,将其粘贴到工件存储库中。当你想要构建依赖于共享基础模块的顶层模块时;构建脚本只是下拉共享基础模块的最后一个版本,并根据它下拉的内容链接/编译顶部模块。