1

我刚刚在一家允许客户定制的产品公司开始了一份新工作。我在产品 A 上工作。

例如,产品 A 出售给客户 1 和客户 2。所以每个客户都要求自己的定制。这些定制必须与主流功能分开。但是,新的主流功能必须包含在每个客户端的副本中,同时保留他们自己的定制。

客户可以请求自定义,从简单的字段命名或添加/删除网格或报告列到添加/删除整个页面或模块。

我们刚刚开始使用 SVN 来管理我们的 C#.net 代码。

我的问题是:根据任何人的经验,在减少重复工作的同时管理所有这些要求的代码的最佳方法是什么:

  1. 适用于所有客户的主流产品功能。
  2. 将每个客户的定制分开,并在客户产品的整个生命周期内为客户保留。

分支可能会解决部分问题,但主流功能不会包含在客户端版本中。

我希望这个问题足够清楚,请尽可能清楚地解释您的建议,也许可以举例说明。谢谢

4

3 回答 3

3

您可以使用

  • 模块化设计(核心+模块集)和客户的最终产品将是单元的组合(可变集) ,易于与存储库中的外部管理(每次定制都会产生上游单元的新分支):它是“供应商分支”的混合+外在
  • Monolite 统一代码,每个客户的定制都收集在一些配置中(您在发布|构建阶段自动创建)和更改(基于此配置)仅应用于客户端的通用代码
  • 混合以前的方法 - 将每个客户端的更改保留在单独的分支中,将分支与主线开发同步(虚拟方式,需要强大的合并策略和准确性,可能需要在集成重构方面做大量工作 merge /google “Merge Hell”,“Big Bang Merge”/ - 但在支持生命周期中间的变化的阶段无缝工作)

我个人更喜欢方式 1——在这种情况下,我每秒钟都知道每个客户拥有哪些产品(并且没有从日志历史中重建它)以及该产品在其整个生命周期中是如何演变的

于 2014-04-27T08:03:01.550 回答
2

在我公司,我们也有同样的情况。我们的解决方案:

  • 在 SvN 中,我们有结构

    主干 - 主要产品版本分支 - 实际客户端版本和新主要版本的未来分支

    • 客户端 1(v1、v2 等)
    • 客户端 2(v1、v2 等)
    • 主要版本分支标签 - 主要产品版本和客户端标签的发布

当我们开发主要产品时,我们致力于主干(或未来的分支)。当客户请求新功能时 - 我们在客户端版本分支中开发此功能。发布后我们制作了客户端标签(在标签中)如果客户端功能很好并且我们决定将其包含到主版本中,我们将他的更改合并到主干。另一方面——如果主干的主要功能必须包含在客户端版本中——我们合并到客户端分支。

我们有大约 6 个不同的客户端版本。实际上我们手动进行合并,但很快我们想批量自动处理这个过程

于 2014-04-27T07:40:27.477 回答
0

我建议不要为每个客户保留一个永远发散的分支。这将使任何更改都变得痛苦,因为可能有一些客户端的分支会产生合并冲突。

从您提供的示例来看,这听起来更像是允许更多配置的简单问题。您可以允许通过某种管理界面配置字段名称、列、页面和模块,并将配置存储在客户端。或者,如果您想保留完全控制权并且不想构建这样的 UI,请将每个客户端的配置存储在您端,并代表他们进行更新。

于 2014-04-27T07:35:54.680 回答