1

我们想为不同的客户创建我们软件的定制版本。这些自定义版本可以或多或少地自定义,因此较小的文件可能有 10 个更改的文件,较大的文件可能有数百个更改的文件。由于可能存在大量自定义版本,因此不想复制/分支整个项目,而只想将更改的文件添加到自定义版本文件夹中。结构可能如下所示:

standard version:
- foo
  - bar
    - Class1
    - Class2
    - Class3

custom version x:
- foo
  - bar
    - Class1

custom version y:
- foo
  - bar
    - Class2
    - CustomClassY

在构建项目时,我们会先检查标准版本,然后检查自定义版本,用自定义覆盖标准文件。然后编译、安装、测试等。

我的问题是:这是一个可用的概念吗?有人部署过这个吗?有哪些障碍?还有哪些选择?

想到的一种替代方法是创建一个传统分支,但定期合并标准版本的更改。也许这可以自动化,以便构建服务器每晚在进行完整构建之前合并更改?

4

3 回答 3

0

您可以这样做,但有一些注意事项 - 您需要考虑如何处理(例如),删除自定义文件夹中基本版本中的文件。

另一种方法是拥有一堆特定于客户的目录(在 /customer 下)。将“香草”版本视为没有增量的客户。然后,您的构建过程是获取基本版本并遍历客户目录,依次构建每个目录。对于奖励积分,您可以考虑使用联合文件系统(如 aufs),这样您就不必每次都刷新基本代码。

或者,您可以将每个客户的更改保存为补丁文件。这将需要在签入/签出方面做更多的工作(除非您使用钩子编写脚本),但应该使保持客户文件最新的过程更加容易。

于 2013-09-04T12:35:39.223 回答
0

一定要使用分支,这是它们存在的一部分。

要记住的重要一点是,如果您签出your_repository/trunk然后使用:

svn copy

或者,如果您使用的是 TortoiseSVN 等客户端,请使用分支/标签选项。

并创建your_repository/branches/customer_name.

然后它创建所谓的浅拷贝——基本上只记录在存储库中几乎没有空间的your_repository/branches/customer_name = your_repository/trunk@SVN_Rev_number_at_the_time 记录——从那时起,只有特定于分支的更改才会占用任何空间,您可以非常快速地将主干中的更改合并到分支中您只需要做任何工作来解决主干和该分支上已更改的文件中的冲突。

但是不要让创建分支的人签出your_repository,使用文件资源管理器或其他类似的东西从复制trunkbranches/some_name然后其添加到存储库 - 不要笑我有一个开发人员多次这样做,即使他已经被展示它造成的混乱。

于 2013-09-06T05:51:28.347 回答
0

虽然我不需要这样的要求,但完全避免分支并将每个客户版本的差异存储为补丁文件怎么样?

然后,您应该能够将每个差异的应用程序合并到您的构建/发布过程中。例如,如果您有一个CustomerPatches目录,其中包含每个客户的一个补丁文件,您可以遍历每个补丁文件以创建一个单独的版本。

MrD对您的问题的评论也是有效的,并且应用补丁文件产生的任何错误都表明存在应该使构建失败的问题。

显然,从长远来看,考虑重构您的应用程序以避免这种困境:)

于 2013-09-06T06:10:55.340 回答