2009-07-28 107 views
4

至于this question替代什么是管理软件的定制版本为特定客户的最佳方式是什么?管理自定义客户端释放

大多数的客户端版本之间的差异是更改用户界面定制软件,看起来它是由客户端拥有。更常见的是,这是一个简单的标志变化。偶尔颜色方案也会改变。但有时会根据客户端启用或禁用功能。将所有这些版本保持最新状态并使其容易供特定客户的用户使用的最佳方法是什么?

在这一点上我们有五个不同的客户端,每个都有自己的软件构建和自己安装(完全与他们的安装程序中的标志)。这成为一种管理的痛苦,随着越来越多的客户开始使用我们的软件,情况将会变得更糟。

因此,假设链接问题不是要走的路,那么管理这些版本的最佳方法是什么?

回答

2

“这已成为一个痛苦的管理, 它只会更恶化和 多的客户开始使用我们的软件 。”

真正解决这部分的唯一方法是,以确保您的软件具有支持自定义为你的核心产品之上的一层的架构。理想情况下,它们只是运行时配置选项(颜色,标识和启用/禁用对此非常合适)。如果您获得(或需要)大量的客户端,将可配置性权利推入核心产品,并使客户能够自行定制。

更新时,您构建(并测试)核心产品一次,并通过将已构建的核心产品链接(引用)为库来构建自定义版本。您可以让每个客户端分别构建,或者您可以使用一个生成过程来生成当前维护的客户端版本(后者可能对更多客户端更好)的更新为全部。如果你有一个“vanilla”版本,你可以将它作为核心的一部分或与客户端版本一起构建,这取决于你的具体情况。

根据您的技术,定制层可能独立于核心产品而构建。在这种情况下,客户端重建很少是必需的(可能仅用于某些重大更改) - 您可以在运行时简单链接到更新的核心产品。要部署到客户端,只需部署更新的内核即可,如果您拥有支持此功能的部署方法。

如果不知道自己的平台很难说更多的细节,但你已经高贵地保持这个问题不可知论。

0

可以说,唯一的不同需要是你拥有的任何版本的一个分支,在它的客户唯一的变化。因此,例如:

/project 
    /trunk 
    /branches 
     /release-v1 
    /customer-branches 
     /release-v1-google 
     /release-v1-microsoft 
.... 

您的客户端版本是您的客户版本的分支机构。由于这些分支不会卷入树干或其他发布分支,因此不要污染常规开发/分支树。

+0

我们目前使用非常短的开发周期,因此每周通常会有“发布”。那么不会认为每周都会在所有这些分支之间合并吗?看起来好像要管理很多。 – 2009-07-28 19:50:00

0

我想这取决于你需要为每个客户定制的水平,但你可以做基于配置文件的基础应用“定制”本身?所以你可以有树干被充分应用,然后有每个客户的特殊配置文件可以控制外观&以及启用的功能,并且您的发布过程将在安装程序中部署正确的配置文件。

看来,如果你总是提供自定义(ISH)您的应用程序为每个客户端的版本,这将是值得以这种方式扩展应用程序的时间。

1
  1. 分隔源代码树中的公共和自定义部分。这可以消除绝大多数合并,具体取决于您的测试和发布政策。总是有一种抽象和定制构建资源的方法,即使您的构建过程必须调用脚本来重写某个文件。

  2. 在良好的源代码管理系统中明智地使用分支。这些并不叫做“配置管理”系统。他们是为了完成这项任务而优化的工具,所以如果没有建立在一个顶层上,你可能不会得到更好的结果。

Subversion擅长设置多个分支,但最后我检查了它只能对单个文件进行三次合并。 Perforce在这个部门非常棒,因为它可以逐个文件地跟踪分支历史记录,并使用它来自动合并整个分支之间的整套变更。这里真的是猫的睡衣。

Git和darcs可能有类似的权力,但我没有使用它们。他们似乎基于这样的想法,即每个正在运行的结帐树都会自始至终复制所有更改。这对我来说听起来不切实际,因为我需要在SCM控制下保留一些大的和不断变化的SDK。

0

我设置了一个叫做的头文件branding.h它包含了一堆#ifdefs,就像下面的例子一样,可以改变任何需要改变的位。在Visual Studio中,通过定义适当的客户端符号很容易设置多个构建。

#if defined BRAND_CLIENT1 
# define COMPANY_NAME "Client 1" 
# define PRODUCT_NAME "The Client 1 Widget App" 
# define LOGO_FILE  "res/logoClient1.ico" 

#elif defined BRAND_CLIENT2 
# define COMPANY_NAME "Client 2" 
# define PRODUCT_NAME "The Client 2 Super Widget App" 
# define ENABLE_EXTRA_MENU 
# define LOGO_FILE  "res/logoClient2.ico" 

#endif 

这都是假设C++的。