7

在处理多平台项目时,我正在寻找有关存储库布局/设计的策略。通常依赖项是:

  • 项目有单一名称/品牌
  • 每个平台都有单独的源代码
  • 平台代码共享公共资源
  • 设计文档和其他文档在平台之间共享

我已经尝试过(使用git)以下:

解决方案 A:

  • 每个平台项目都驻留在自己的目录中
  • 提交master适用于所有平台

优点

  • 干净的代码开发
  • 没有合并

缺点

  • 日志是一团糟,您通常需要在所有提交日志前加上平台
  • 有时撤销提交是..不可能或非常困难/混乱

解决方案 B:

  • 每个平台都有自己的分支
  • 释放时对每个分支执行rebase,然后合并到master+标签

优点

  • 清理日志:)
  • 清洁分离发展进度
  • 减少冲突

缺点

  • 需要合并到master
  • 当所有平台同时变基时 - 合并到主是地狱

我对创建每个平台的存储库犹豫不决,因为共享资源可能很困难,或者需要额外的、可能容易出错的任务。

期待你们的专业知识。

4

2 回答 2

2

这似乎是一个扩大规模的问题。存储库通常包含一个项目。一个项目的几个部分可能共享一个实用模块,但对于小型项目,规模不够大,无法考虑将实用模块分离出来作为自己的实体。但是,一旦实用程序模块变得“大”,或者如果需要将共享它的几个独立实体分离出来,它就需要成为自己的(版本化)模块。

我的方法使用单独的存储库,具体取决于涉及多少代码。我不确定您所说的添加任务是什么意思,尽管它是一个主要的重构。我要做的第一件事是将共享资源制作成一个独立的存储库,并将其发布作为(特定于版本的)依赖项合并到每个平台构建中。这将每个平台上的开发与单个共享资源版本分离。无论如何,对共享项目的每次更改都需要测试每个平台,现在您有了清晰的分界线。然后,您可以一次使每个项目都有自己的存储库。

如果你想在多个平台上拥有一个项目的“共享发布”,你需要一个作为构建代码根目录的“项目”。您也可以考虑为该代码使用共享存储库,但这会将共享代码的发布与项目的发布结合起来。如果您的代码已经达到这种复杂程度,您可能想要的是另一个存储库,仅用于存放您的构建代码的“元项目”。除非您有一大堆项目要处理,否则多个项目的构建都可以驻留在一个存储库中,从而允许它们共享通用代码。再次出现同样的问题,但是对于小规模,单个存储库可以工作。请注意,所有这些都假设某种程度的自动化测试:)

我对多模块项目的经验来自使用 perl 和 java。在 perl 中,使用来自 CPAN 的许多独立共享模块是常态。在 java 中,可以使用 Apache Ivy 或 Maven 处理模块化依赖关系。我在一个环境中使用 Maven,该环境具有公司的顶级元项目和每个产品的单独项目(取决于公司元项目)。每个项目都可以自由地做它需要做的事情。从一个项目升级到两个或多个项目之间共享的代码将成为它自己的项目。一个特别大的项目最终被分解为几个项目,这些项目都继承自它自己的“元项目”。处理这种分层依赖是 Maven 和 Ivy 构建的目的。我们使用 Jenkins/Hudson 作为集成服务器,每晚自动检查跨项目构建(假设没有人逃避编写测试......)。曾经我们需要为整个公司更改网站。没问题,在公司元项目中改过一次,在每个项目的新版本中自动拾取!

于 2012-09-20T21:59:06.610 回答
1

可能是另一种解决方案:

分成三个(或更多)存储库:

platform1 specific
platform2 specific
common for all platforms

然后,您可以通过submodules将公共存储库添加到其他存储库中。

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

尽管我应该警告说 repo 非常专注于Gerrit 。

于 2012-09-20T23:46:51.757 回答