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