(以下是我在组织正在处理的源代码时遇到的复杂性的一种“理论 MCVE”。您可以将其视为一个具体问题,这会很好,或者您可以参考它提出的一般问题并建议如何解决这些问题。)
假设我有代码 A、B、C 和 D 的模块。A 依赖于 B、C、D;B依赖于C;C、D 不依赖于其他模块。(我松散地使用术语“模块”,所以请不要在这里挑剔)。
此外,在所有的 A,B,C,D 中,使用了几个相同的头文件,甚至可能是一个编译对象,将它们放在一起形成第五个模块没有意义,因为它太小了和无用的。让我们foo.h
成为该类别中的文件之一。
虽然所有这些模块都保存在一个单一的整体代码存储库中,但一切都很好。一切都只有一个副本;使用相同函数等编译的对象之间没有链接器冲突。
问题是:如何使 B、C、D 中的每一个都成为版本管理的存储库,以便:
- 它们中的每一个都可以仅在其依赖的模块存在的情况下构建(作为子模块/子存储库或其他方式);和
- 我不需要确保和手动维护/更新相同文件的不同版本,或者从一个库到下一个库进行结转提交(除了可能更改指向的修订版);和
- 当所有东西都构建在一起时(即构建 A 时),构建不涉及
foo.h
C 的四重副本和双重副本(一次用于 A,一次用于 B)——我可能总是必须确保并保持完全同步。
请注意,当我有更多时间时,我将对其进行编辑以使问题更加具体(尽管我有点喜欢广泛的问题)。我会说,在我的具体情况下,代码是现代 C++、CUDA、一些 bash 脚本和 CMake 模块。所以面向 Java 的解决方案是行不通的。