我们的项目在 svn 下,一切进展顺利。最近一个大客户要求我们为他们做一些非常具体的定制,这些定制需要编码和东西(不能使用配置或部署来完成)。我们决定维持两条独立的发展路线:
trunk
分支是我们部署的标准版本普通客户
arsh
分支是针对这个客户的,并且正在与 trunk
中正在发生的事情分开进行开发。 现在是
arsh
应该每年收到来自 trunk
的更新有时在 arsh
中实现的功能在 trunk
中很有用.这种关系是双向的,但一个方向非常普遍(从 trunk
到 arsh
),而另一个方向是偶尔的。最好的方法是什么?工作流程 ?最佳实践?见解?
编辑:我们使用 PHP 5.3、MySQL、Apache 和 Linux。
最佳答案
最佳实践? #ifdef
(或由运行时配置或任何其他编译时或运行时条件有条件地包含或有条件地依赖注入(inject)的相同接口(interface)的单独实现)!
在任何版本控制系统中,将并行版本作为分支来维护是一件很痛苦的事情。最好使用适当的条件编译或运行时配置技术来维护并行版本。
请记住,如果将分支 A 合并到分支 B,然后将分支 B 合并回分支 A,则两个分支将完全相同。这是 3 路合并的内在属性。这正是你想要的功能分支,但它完全不适合为不同的客户维护并行版本。
为了为不同的客户保留版本,请改用条件编译。
这种方法允许每个人通过对所有变体运行测试或由持续集成服务器构建和测试所有变体来立即检查他们没有破坏任一变体的任何功能。
你提到PHP。那里没有编译步骤,因此配置将只是运行时。我可能会创建一个包含特定于客户的覆盖的目录,这些覆盖将有条件地包含在适当的模板中。
注意:我目前正在开发一个 C++ 项目,该项目以这种方式为 20 多个客户定制,并且可以很好地扩展。我们没有每个客户的确切代码,而是我们有一组可选的功能,并且不同的子集被运送给不同的客户。这使得测试所有特性变得更容易一些,因为我们可以构建一个最大的变体并对其进行测试。当您发展到大量功能时,这会有所帮助,特别是如果您的项目需要很长时间才能构建(我们的持续集成构建运行大约一个小时,每晚构建 8 小时,构建所有客户变体需要超过一整天)。
关于svn - 在 svn 下保持两条非常接近但独立的开发线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15340277/