3

所以我们有应用程序 Pluto 和应用程序 Goofy - 两者都使用相同的 SVN 项目。实际上只有一点配置差异。

现在我面临这个问题:来自 Pluto 的客户想要一些新的变化 - 详细地说,他想要为 Javascript 和我们在 JSF 环境中使用的一些 xhtml 标签添加功能。基本上,这是他要求的一种改进 javascript 的方法 - 旧功能必须仍然存在。但是:新功能可能会破坏 Goofy 的某些部分,因为 Goofy 是一个更大的应用程序并且难以测试。实际上,Goofy 是 Pluto 的超集——例如,Goofy 可以做 Pluto 所做的任何事情——但实际上它只是为了测试,最终的 Product 驻留在 Pluto 中。

需要更改的文件是相当静态的,我认为对其中一个文件的最后一次更改是半年多前。在过去的两年里,肯定不会超过几个变化。

我想到的是为 Pluto 创建一个分支,在其中实现对 javascript 和 xhtml 标签的所有更改。开发人员将在主干上开发,我将始终在部署之前合并来自分支的更改(这可能会自动完成)。但是:本地开发有一个问题——因为是trunk,新功能只在分支上,所以在本地为Pluto开发时,新功能将不可用。

另一种方法是使用例如如果 application==Goofy 加载 javascript Goofy,反之亦然。

或者最后 - 尝试和错误,例如合并所有更改并修复错误:-)

你们会如何决定这个?

4

1 回答 1

3

我会使用不同的分支并接受合并带来的不便,而不是像if application==Goofy一周中的任何一天那样使用特殊技巧。当您的程序的复杂性增加并且可能添加更多应用程序时,后一种实现肯定会咬住您。

另一种可能更适合您的方法是重构您的代码并将应用程序的核心部分分解为它自己的项目。然后让每个应用程序分别引用核心项目。例如,核心部分可能包含业务逻辑,而 Goofy/Pluto 处理 GUI 和/或某些核心部分的特殊实现。您的 SVN 树可能类似于:

trunk
  |--- Core stuff
  |--- Project Pluto
  |--- Project Goofy

一种更复杂但非常灵活的方法是将核心内容移动到自己的存储库中。然后,您可以使用svn:externals将核心部分包含到您的项目中。这将使您能够将 Pluto 和 Goofy 锁定到 Core Stuff 的某些修订版中。因此,您可以更新核心内容以添加一个项目所需但对另一个项目有害或不受欢迎的更多功能。我已经在行动中看到了这一点,并且效果很好。我们有非常过时的遗留代码,但即使在遗留项目的开发停止后核心部分已经升级多年,但仍然可以编译和工作。

Core trunk
  |--- Core stuff (rev 123)

Application trunk
  |--- Project Pluto (Core rev 111)
  |--- Project Goofy (Core head)

如果您想使用最后一个选项,博客文章svn:externals应该会有所帮助。

于 2012-08-22T18:41:40.487 回答