我正在开发一个项目,该项目将(很快)分支为多个不同版本(试用版、专业版、企业版等)。
自从 Subversion 首次发布(以及之前的 CVS)以来,我一直在使用它,所以我对分支和标签的抽象概念感到满意。但在我所有的开发经验中,我只真正研究过主干代码。在极少数情况下,其他一些开发人员(拥有存储库)要求我将更改提交到某个分支,而我只是按照他的要求去做。我认为“合并”是一种奇异的魔法,而且我只是在仔细监督下尝试过。
但在这种情况下,我负责存储库,这种事情对我来说是全新的。
绝大多数代码将在所有产品之间共享,因此我假设代码将始终驻留在主干中。我还假设每个版本都有一个分支,每个产品的发布版本都有标签。
但除此之外,我知道的不多,而且我敢肯定有一千零一种不同的方法来搞砸它。如果可能的话,我想避免把它搞砸。
例如,假设我想为专业版和企业版开发一个新功能,但我想从演示版中排除该功能。我将如何做到这一点?
在我的日常开发中,我还假设我需要在工作时将我的开发快照从一个分支切换到另一个分支(或返回到主干)。以最小化混乱的方式做到这一点的最佳方法是什么?
你们还有什么其他的策略、指导方针和技巧建议?
更新:
好吧,那好吧。
看起来分支根本不是正确的策略。因此,我更改了问题的标题以删除“分支”焦点,并且我正在扩大问题范围。
我想我的其他一些选择是:
1) 我始终可以分发具有所有功能的软件的完整版本,并使用许可证根据许可证中的授权选择性地启用和禁用功能。如果我采用这条路线,我可以想象 if/else 块的老鼠巢调用某种单例“许可证管理器”对象。在这种情况下避免代码意大利面的最佳方法是什么?
2)我可以使用依赖注入。但总的来说,我讨厌它(因为它将逻辑从源代码移动到配置文件中,这使得项目更难理解)。即便如此,我仍在分发完整的应用程序并在运行时选择功能。如果可能,我宁愿不将企业版二进制文件分发给演示用户。
3) 如果我的平台支持条件编译,我可以使用#IFDEF 块和构建标志来选择性地包含功能。这对于像整个 GUI 面板这样的大而粗的功能来说效果很好。但是对于较小的跨领域音乐会呢……例如日志记录或统计跟踪?
4)我正在使用ANT来构建。是否有类似 ANT 的构建时依赖注入之类的东西?