多平台项目存储库设计策略

Mar*_*Gil 7 git version-control mercurial multiplatform project-organization

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

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

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

解决方案A:

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

优点:

  • 清洁代码开发
  • 没有合并

缺点:

  • 日志很乱,你通常需要在所有提交日志前加上平台
  • 有时逆转提交是......不可能或非常困难/凌乱

解决方案B:

  • 每个平台都有自己的分支
  • 当在每个分支上执行释放rebase然后合并到master+标记时

优点:

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

缺点:

  • 需要合并到 master
  • 当所有平台同时降级时 - 合并到主人是HELL

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

期待您的专业知识.

Stu*_*rys 2

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

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

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

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