6

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

自从 Subversion 首次发布(以及之前的 CVS)以来,我一直在使用它,所以我对分支和标签的抽象概念感到满意。但在我所有的开发经验中,我只真正研究过主干代码。在极少数情况下,其他一些开发人员(拥有存储库)要求我将更改提交到某个分支,而我只是按照他的要求去做。我认为“合并”是一种奇异的魔法,而且我只是在仔细监督下尝试过。

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

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

但除此之外,我知道的不多,而且我敢肯定有一千零一种不同的方法来搞砸它。如果可能的话,我想避免把它搞砸。

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

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

你们还有什么其他的策略、指导方针和技巧建议?


更新:

好吧,那好吧。

看起来分支根本不是正确的策略。因此,我更改了问题的标题以删除“分支”焦点,并且我正在扩大问题范围。

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

1) 我始终可以分发具有所有功能的软件的完整版本,并使用许可证根据许可证中的授权选择性地启用和禁用功能。如果我采用这条路线,我可以想象 if/else 块的老鼠巢调用某种单例“许可证管理器”对象。在这种情况下避免代码意大利面的最佳方法是什么?

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

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

4)我正在使用ANT来构建。是否有类似 ANT 的构建时依赖注入之类的东西?

4

3 回答 3

2

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

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

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

于 2009-05-31T16:09:54.727 回答
2

一个最有趣的问题。我喜欢分发所有内容然后使用许可证密钥来启用和禁用某些功能的想法。您确实担心通过代码并继续检查用户是否获得特定功能的许可需要大量工作。这听起来很像您在使用 java 工作,所以我建议您考虑使用方面编织器在构建时插入用于许可证检查的代码。仍然会有一个对象,所有对许可证检查的调用都会进入其中,但是如果您使用的是方面,这并不是一种糟糕的做法,我会说这是一种很好的做法。

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

作为替代方案,您可以分发多个 jar,每个组件一个,每个组件都获得许可,并且只允许加载获得许可的类。您必须绑定到类加载器才能实现这一点。

于 2009-06-12T01:54:58.180 回答
1

你不要这么快跳上分支和合并车是对的。这是一个皮塔饼。

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

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

于 2009-05-31T16:29:05.427 回答