多平台项目仓库设计策略

7
我正在寻找有关多平台项目仓库布局/设计的策略。通常,依赖关系如下:
- 项目只有一个名称/品牌 - 每个平台都有单独的源代码 - 平台代码共享公共资源 - 设计文档和其他文档在平台之间共享
我已经尝试过以下方法(使用git):
解决方案A:
- 每个平台项目位于自己的目录中 - 所有平台的提交都进入主分支(master)
优点:
- 清晰的代码开发 - 不需要合并
缺点:
- 日志混乱,通常需要在提交日志中加上平台前缀 - 有时候撤销提交是不可能的或者非常困难/混乱
解决方案B:
- 每个平台都有自己的分支 - 发布时,在每个分支上执行变基(rebase),然后合并到主分支(master)+标记(tag)
优点:
- 清晰的日志 :) - 开发进度的清晰分离 - 冲突较少
缺点:
- 需要合并到主分支(master) - 当所有平台同时进行变基时,合并到主分支(master)会非常困难
我犹豫是否创建每个平台的仓库,因为共享资源可能会很困难,或者需要额外的、可能容易出错的任务。
期待您们的专业意见。

在这个“多平台项目”中,您是否使用了不同的编程语言,如C、Java等? - yorkw
当然,Android使用Java,iOS使用Objective-C等等。 - Marcin Gil
2个回答

2
这似乎是一个规模扩大的问题。一个仓库通常包含一个项目。一个项目的几个部分可能共享一个实用模块,但对于小型项目来说,规模不够大,不需要考虑将实用模块分离出来作为自己的实体。然而,一旦实用模块变得“大”或者如果需要将共享它的几个独立实体分离出来,它就需要成为自己的(有版本的)模块。
我的方法是根据涉及的代码量使用单独的仓库。我不确定你所说的添加任务是什么意思,尽管这是一个重大的重构。我要做的第一件事是将共享资源制作成一个独立的仓库,并将其发布为每个平台构建的(特定版本的)依赖项。这将使每个平台开发与单个共享资源版本分离。对共享项目的每个更改都需要测试每个平台,现在你有了一个清晰的分界线。然后,您可以逐个将每个项目制作为自己的仓库。
如果您想在多个平台上拥有一个“共享发布”的项目,则需要一个“项目”作为该构建代码的根。您可能也考虑使用共享仓库进行该代码,但这会使共享代码的发布与项目的发布耦合。如果您的代码已达到这种复杂程度,那么您可能需要另一个仓库来存储托管构建代码的“元项目”。除非您有一组非常庞大的项目要处理,否则多个项目的构建都可以驻留在一个仓库中,从而允许它们共享公共代码。同样的问题再次出现,但是对于小规模,单个仓库就足够了。请注意,所有这些都假定某种程度的自动化测试:)
我在使用Perl和Java的多模块项目方面有所经验。在Perl中,使用来自CPAN的许多独立共享模块是正常的。在Java中,可以使用Apache Ivy或Maven处理模块依赖项。我在一个公司有顶层元项目和每个产品的单独项目(依赖于公司元项目)的环境中使用了Maven。每个项目都可以自由地进行所需的操作。从一个项目升级为两个或更多项目之间共享的代码将成为它自己的项目。一个特别大的项目最终被分成几个项目,所有这些项目都继承自它自己的“元项目”。处理这种分层依赖关系是Maven和Ivy的构建目标。我们使用Jenkins/Hudson作为集成服务器,每晚自动检查跨项目构建(假设没有人在编写测试时逃避责任...)。一旦我们需要更改整个公司的网站。没问题,在公司元项目中更改它,然后它会在每个项目的新版本中自动更新!

我所说的额外任务是指,例如,如果使用单独的存储库(或git子模块),当共享资源发生更改时,需要记住更新所有平台 - 如果无法自动化。有时会忘记这一点,这可能会导致不必要的麻烦。 - Marcin Gil
在每个平台构建中包含一个测试,检查当前版本的(所有)公共依赖项是否是最新的。这确实需要测试对共享位置的访问权限,最容易的方式是来自公共代码的存储库。您只需要执行一次即可。如果忽略测试,则平台可能仍将使用旧的公共代码版本,但测试仍将失败。 - Stuart R. Jefferys
有人知道一些关于这个主题的合法写作吗?这可能是一个热门话题,对于那些从svn世界出来的人来说。我需要更多的支持。 - Nick

1
可能的另一种解决方案:
将其分成三个(或更多)存储库:
platform1 specific
platform2 specific
common for all platforms

您可以通过submodules将常见的repo添加到其他存储库中。

此外,Google在Android存储库中通过开发自定义工具repo解决了类似的问题。 Repo使用包含XML文件(manifest.xml或default.xml,请参见.repo / manifests中)的自定义git存储库(清单),列出应检出哪些Git存储库。这样,您也可以创建上述三个存储库和另一个包含XML文件的存储库,以便一起使用它们,甚至可以在此清单git中为每个平台创建分支。

尽管我应该警告repo非常Gerrit集中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接