从一个代码库开发多个产品的策略

时间:2009-05-31 16:05:55

标签: version-control build-process release-management

我正在开展一个项目,该项目将(很快)分为多个不同版本(试用版,专业版,企业版等)。

我一直在使用Subversion,因为它首次发布(以及之前的CVS),所以我对分支和标签的抽象概念感到满意。但在我的所有开发经验中,我只是真正研究过中继代码。在少数情况下,一些其他开发人员(拥有存储库)要求我对某个分支进行更改,我只是做了他要求我做的任何事情。我认为“合并”一种奇怪的黑色艺术,我只是在仔细的监督下尝试过它。

但在这种情况下,我负责存储库,这种事情对我来说是全新的。

绝大多数代码将在所有产品之间共享,因此我假设代码将始终位于trunk中。我还假设每个版本都有一个分支,每个产品的发布版本都有标签。

但除此之外,我不太了解,而且我确信有一千零一种不同的方法可以解决这个问题。如果可能的话,我想避免搞砸它。

例如,假设我想为专业版和企业版开发一个新功能,但我想从演示版中排除该功能。我将如何实现这一目标?

在我的日常开发中,我还假设我需要在工作时将开发快照从分支切换到分支(或返回到主干)。以最小化混淆的方式,最好的方法是什么?

你们建议的其他策略,指南和提示是什么?


更新

好吧,那好吧。

看起来分支根本不是正确的策略。所以我已经改变了问题的标题,以消除“分支”的焦点,我正在扩大这个问题。

我想我的其他一些选择是:

1)我总是可以使用所有功能分发完整版本的软件,并使用许可证根据许可证中的授权有选择地启用和禁用功能。如果我采用这种方式,我可以想象一个老鼠的if / else块嵌套调用某种单独的“许可证管理器”对象。在这种情况下避免代码意味着什么的最佳方法是什么?

2)我可以使用依赖注入。但一般来说,我讨厌它(因为它将逻辑从源代码转移到配置文件中,这使得项目更难以理解)。即便如此,我仍在发布完整的应用程序并在运行时选择功能。如果可能,我宁愿不将企业版二进制文件分发给演示用户。

3)如果我的平台支持条件编译,我可以使用#IFDEF块并构建标志来有选择地包含功能。这适用于像整个GUI面板这样的大而粗糙的功能。但是,对于较小的跨领域音乐会,例如日志记录还是统计跟踪呢?

4)我正在使用ANT来构建。是否有像ANT的构建时依赖注入?

3 个答案:

答案 0 :(得分:2)

你想通过Subversion做到这一点吗?我会使用Subversion来维护不同的版本(每个版本的分支,例如v1.0,v2.0等),但我会考虑从相同的代码库。

这样你只需通过构建启用或禁用各种功能,而不必担心同步不同的分支。如果您使用Subversion来管理不同版本和不同版本,我可以在不久的将来看到分支/标签的爆炸式增长。

对于切换,您可以简单地维护签出的代码库,并使用svn switch签出不同的版本。与为每个交换机执行新的检出相比,它耗时少得多。

答案 1 :(得分:2)

一个最有趣的问题。我喜欢分发所有内容然后使用许可证密钥启用和禁用某些功能的想法。您有一个有效的担忧,即通过代码进行大量工作并继续检查用户是否获得某项功能的许可。这听起来很像你在java中工作,所以我建议你使用一个方面编织器在构建时插入代码进行许可检查。所有要求进行许可证检查的人仍然会有一个对象,但是如果你使用某个方面,它并不像练习那么糟糕,我会说这是一个好习惯。

在大多数情况下,您只需要阅读某些内容是否已获得许可并且您将拥有少量组件,因此该表可以始终保存在内存中,因为它只是读取您不应该太多线程问题。

作为替代方案,您可以分发许多罐子,每个罐子对应一个许可的组件,并且只允许加载许可的类。您必须绑定到类加载器才能实现此目的。

答案 2 :(得分:1)

你是对的,不要那么快地跳上分支和合并车。这是PITA。

我想分支subversion存储库的唯一原因是我想与其他开发人员共享我的代码。例如,如果您一起处理某个功能但尚未完成,则应使用分支进行通信。否则,我会尽可能地留在行李箱上。

我接受Brian的建议,以区分构建版本而不是代码库。