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

时间:2017-04-02 16:09:09

标签: version-control mercurial directory-structure mercurial-subrepos subrepos

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

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

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

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

enter image description here

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

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

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

1 个答案:

答案 0 :(得分:1)

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

相关问题