我们有一个大型项目,包括以下内容:
- A:C++ 源代码/库
- B:使用 SWIG 包装 C++ 库的 Java 和 Python
- C:用 Java 编写的 GUI,依赖于 Java API/包装。
人们以所有可能的方式使用该项目:
- 使用 C++ API 的 C++ 项目
- 使用 Java API 的 Java 项目
- Python 脚本
- MATLAB 脚本(使用 Java API)
- 通过 Java GUI
目前,A、B 和 C 都在一个 Subversion 存储库中。我们正在迁移到 git/GitHub,因此我们有机会进行重组。我们正在考虑将 A、B 和 C 拆分为他们自己的存储库。这给我们提出了几个问题:
- 将 Java 和 Python SWIG 包装(即接口 (*.i) 文件)拆分到单独的存储库中是否有意义?
- 目前,SWIG 生成的 .java 文件在 GUI 的源代码树中输出,并在 SVN 中进行跟踪。由于我们不想在 git 存储库中跟踪机器生成的文件,那么维护 GUI 对 SWIG 生成的 .java/.jar 文件的依赖关系的最佳方法是什么?考虑一下:如果一个新开发人员想要构建 Java GUI,他们不应该需要从头开始构建 A 和 B;他们应该能够获得 C 的副本,他们可以从中立即构建 GUI。
- 版本控制:当一切都在一个存储库中时,A、B 和 C 必须彼此一致。当我们有不同的存储库时,GUI 需要使用已知版本的包装,并且包装需要使用已知版本的 C++ API。管理此问题的最佳方法是什么?
我们对每个问题都进行了深入思考,但想听听社区将如何处理这些问题。也许 git submodule/subtree 是其中一些解决方案的一部分?这些我们都没有使用过,似乎子模块让人有些头疼。有没有人有这两种方法的成功故事?