处理特定于客户的软件补丁的现实方法是什么?


16

我正在尝试收集其他人解决以下问题的有效方法。在工作中,我们被迫发布仅希望特定客户看到的软件补丁(安装在最终用户系统上)。定制代码位于其自己的源代码控制分支中。问题是我们有两条并行的代码行(和构建脚本)保持同步,并且每次我们修补原始代码时,我们都必须修补和测试客户特定的代码。

我很好奇,其他组织如何处理这种情况?我们向业务解决方案开放,而不仅仅是技术(与源代码控制相关)解决方案。例如,我们已经讨论过告诉客户他们无法在该分支上接收更新。

我们的分支策略是这样的(基于Visual Studio TFS分支指南,尽管我们正在使用Subversion) 在此处输入图片说明


如果您正在使用,hg或者git我可能建议您使用补丁队列(Mercurial Queues ExtensionStacked Git),但我不知道TFS是否具有类似功能。
Mark Booth 2012年

也许我应该已经指定了,即使我们使用TFS建议的分支策略,我们仍在使用Subversion:P补丁队列会减少必要的测试吗?看起来这些是用于源代码控制补丁的吗?我们正在处理客户安装到最终用户系统上的补丁程序。
Vimes 2012年

2
一个商业解决方案是:不要这样做。
JeffO 2012年

@JeffO good call =)无论如何,有什么方法可以使它成为数据驱动的运行时开关?
Patrick Hughes 2012年

1
@JohnB-对不起,我不知道,但是如果您有源补丁,那么您的构建系统应该能够自动化测试,并且将每个客户补丁都保留在外面,这svn意味着他们不会使您的正常工作流程变得混乱。如果补丁队列看起来有用,可以使用git-svnhgsubversion尝试。使用DVCS前端来简化棘手的工作流程svn甚至可能会鼓励人们考虑转向DVCS批发,以获得所有其他好处。
Mark Booth 2012年

Answers:


5

当您开始发布客户特定的补丁程序时,您已经立即创建了必须随产品一起维护的产品的新版本。这意味着必须在两个版本之间传播更改。通常,客户特定的修补程序是客户应拥有的自定义内容,包括源代码。

这似乎不大可能,一个补丁修复的东西也不会让它到主线分支,除非这是一个不太理想的临时的办法解决眼前的问题。如果是这种情况,则仅需要维护补丁,直到预期的修复程序进入主线为止。


5

在我看来,关键是“可见的”-根本没有单独的代码分支,而是可以改变行为的配置选项?


这可能适用于简单的自定义,但是更复杂的自定义可能会使产品对于所有客户而言更加尴尬和不稳定。
FrustratedWithFormsDesigner 2012年

3
@FrustratedWithFormsDesigner针对单个客户的复杂自定义表示产品管理和设计中的重大疏忽。任何需要单个产品的单独分支机构的解决方案都表示该产品在满足所有客户需求方面存在严重不足,并且产品所有者的管理不善。
maple_shaft

2
我也看到过一次又一次地咬我的前雇主。这只是不好的做法,但是通常这是管理层想要的,并且不会失败。特别是如果您使用Subversion,这只是一场噩梦,不会消失-保持代码同步会一次又一次地伤害您。
史蒂夫·希尔

1
@maple_shaft-但是您是否想问一个问题“您是否曾经使用代码分支来实现国际化”?
psr 2012年

3
@maple_shaft-我在开玩笑,但是,实际上,这就是我的观点,使用分支来处理国际化至少和特定于客户的分支一样糟糕。在您可能也不想在这样的地方工作的意义上,这并不是没有意义的。关于我的话题已经完全没有意义了。
psr 2012年

3

您认为这是短期还是长期的事情?事实是,企业已经决定适应这个客户,因此从短期来看,这已经是一个主要由商业实践解决的业务决策(接受额外费用/向客户收取费用)。

如果是长期的,那么如果您重构软件以通过配置(或设置等)轻松满足客户需求,您可能会看到节省。

如果这是相对短期的,则意味着您将很快将这些更改合并回main / development分支,并且所有用户也将看到这些更改,那么在当前情况的限制内工作可能是可以接受的。就像我说过的那样,应该在做出适应客户的决定时做出决定。

长话短说。从技术上长期解决它,短期内解决它。

当然,有一点就是抛硬币。如果您在那时,那么我将做开发人员喜欢的任何事情。


2

我们也使用颠覆-我们碰​​到了这种情况。

这里有一些要记住的要点:

  1. 虽然有必要一定要避免为客户提供专门的分支机构,但必须将其需求减至最少。总是问是否有可能推广可能适用于所有人的解决方案。

  2. 客户特定的分支机构必须源自新版本。假设您有一个1.2版,并且从1.2.1版到1.2.11版都已经衍生了-应该允许客户分支所有补丁,因此客户分支必须与主版本保持兼容

  3. 开始新的不兼容版本时,需要重新创建客户特定的分支。不幸的是,您可能需要以某种方式重新进行工作。一种解决方案是从客户分支中创建所有补丁,然后将其提取,然后将仍然兼容的任何内容应用于新的客户分支。

  4. 始终在任何情况下都不应将客户特定的更改推回发布分支或主干。但是,理想情况下,应尝试以减少此类特定于客户的工作的方式来概括该工作。

我试图将这些想法放在一起显示下图


1

如何在代码中引入扩展机制?

您的主要代码有:

class Foo
{
}

程序启动时,将在其启动文件夹中检查DLL /道德等效项以进行本地自定义。如果找到一个,它将加载并且可能包含公司特定版本的Foo

class FooForABC : Foo
{
}

FooForABC实现与Foo相同的行为,但会根据需要重写功能以提供ABC所需的特定行为。该技术应足够灵活以处理您需要支持的任何方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.