使用SVN和Delphi Visual Component软件包的最佳实践?

时间:2011-03-24 16:03:59

标签: delphi svn version-control

希望能够重现使用第三方可视组件包的项目的给定修订版,SVN中的内容以及实现/构建SVN回购的最佳方式是什么?

对于非可视组件,规则似乎很简单,以确保不依赖外部回购 - “没有允许任何外部回购的svn-externals参考”。我有一个我控制的共享仓库,这是唯一允许的'svn-externals'参考。这使得在不同的SVN项目中使用源代码实现和共享这些类型的运行时项目变得容易。任何对这个内部共享仓库的引用都是'svn-externals'使用特定的修订号。

视觉包似乎与能够轻松控制版本相反,因为它们可能必须在每个版本重新安装。如何最好地创建一个能够在以后以特定版本号重新创建的SVN项目...是否有推荐的解决方案?

以前我们并不担心第三方组件,因为它们不经常更改,我们从来没有真正好的解决方案。我想知道其他人是否已经找到解决这个问题的最佳方法,因为我正在进行春季大扫除/内部重组,并希望比以前做得更好。

从技术上讲,RTL / VCL源也应该在SVN仓库中(如果发布了Delphi修补程序/服务包。)

我的解决方案可能是创建一个虚拟机,其中包含安装了所有可视控件的Delphi环境的特定版本。在我们添加/更新可视控件或使用修补程序/服务包更新Delphi时,我们会创建一个新版本的虚拟机。然后,我们将此VM版本的映像存储在某个架子上。这是你做的吗?在这种情况下,Delphi激活/许可是否运行良好(或根本没有)?

谢谢,

达里安

3 个答案:

答案 0 :(得分:7)

您可以为项目准备“启动IDE”(可能还有“构建”)脚本,并将其作为项目在存储库中的演变进行维护。

无论您决定将组件保存在单独的存储库中还是使用外部组件,或将它们包含在具有可能分支的单个存储库中,您还应该为每个组件构建和为特定Delphi版本准备的每个分支包含已编译的bpl文件。

你绝对应该尝试保持大多数(如果不是全部)路径相对,在最坏的情况下使用环境变量指向你的根项目目录。

启动IDE脚本允许您在单个Windows安装上保持每个项目和Delphi版本环境的单独配置。

它应该包含项目和Delphi的必要注册表项:

Windows Registry Editor Version 5.00

[-${DelphiRegKey}\Disabled Packages]
[-${DelphiRegKey}\Known Packages]
[-${DelphiRegKey}\Library]

[${DelphiRegKey}\Known Packages]
"$(BDS)\\Bin\\dclstd${CompilerVersion}.bpl"="Borland Standard Components"
"$(BDS)\\Bin\\dclie${CompilerVersion}.bpl"="Internet Explorer Components"
"$(BDS)\\Bin\\dcldb${CompilerVersion}.bpl"="Borland Database Components"
(...)
"${CustomComponentPack}"="Custom Components"

[${DelphiRegKey}\Library]
"Search Path"="${YourLibrarySourceFolder1};${YourLibrarySourceFolder2}"
(...)

然后您可以准备批处理文件:

regedit /s project.reg
%DelphiPath%\bin\bds -rProjectRegKey Project.dpr

${DelphiRegKey}HKEY_CURRENT_USER\Software\Borland(or CodeGear in newer versions)\ProjectRegKey

基本上,当你从注册表中转储当前的工作配置,从不必要的键中删除它,将路径更改为relative,然后适应它以使它适用于你的项目时,它会更容易。

在这样的配置中,在具有不同组件集(和/或可能使用不同的Delphi版本)的项目及其分支之间进行切换只需要检出存储库并运行脚本。

答案 1 :(得分:3)

幸运的是,我们不必担心修补程序/服务包;我们还在使用Delphi 5.:D

  

叹息,曾经有一段时间,整个应用程序(设置和所有)都存在于一个目录中 - 这使得这个问题无法解决。但是,世界已经转移,我们将应用程序的各个部分分散在各处:

     
      
  • 注册表
  •   
  • 的Windows \系统
  •   
  • 程序文件
  •   
  • 有时甚至是“应用程序数据”或“本地设置”中的用户文件夹
  •   

考虑修补程序/服务包的影响是完全正确的。不仅RTL / VCL可能会受到影响,而且编译器本身可能会略有改变。另请注意,即使在升级Delphi版本时,也要运行相同的思路,您需要使用正确的版本进行构建。不可否认,这有点容易,因为你可以互相运行不同的Delphi版本。

但是,我会建议你可能不值得付出太多努力。 请注意,使用旧版本始终比使用当前版本更昂贵。

  • 理想情况下,您希望所有开发人员都使用主分支代码,您希望最大限度地减少旧版本的补丁工作。
  • 努力尽可能让大多数用户保持最新版本。
  • 不可否认,这并非总是可行。
  • 在任何情况下,如果没有先进行一些测试,你就不想跳到'新版本'。
  • 某些敏捷流程确实可以使这更容易。
  • 通过使用单独的构建计算机或VM,您已经拥有一定程度的控制权。
  • TIP: I would also suggest that the build process automtically copy build output to a different machine, or at least a different hard-drive.
  • 对服务包感到满意后,您可以计划何时将其推送到构建计算机。
  • 保留构建配置更改的标签记录非常重要。 (以防万一。)
  • If your build scripts are also kept in source control, this happens implicitly.
  • 当您推出修补程序/ Service Pack时,应该主动不建议修复旧版本。
  • 当然,它们可能无法消除,但如果它足够罕见,那么即使手动重新配置也是可行的。
  • Instead of a VM option to keep your old configuration, you can also consider drive-imaging.
  • 要保存VMWare LabManager的$$$,请查找命令行驱动的VM Player。
  • 您可能需要保留2台“实时”计算机/虚拟机,但绝不需要更多。
  • It's okay for an automatic build script to fail because the desired configuration isn't available. This will remind you to set it up manually.
  • 请记住,使用旧版本始终比使用当前版本更昂贵。

第三方套餐

我们在这里付出了更多的努力。我们的主要动机之一是我们使用大约8个第三方包。所以做一些事情来标准化它的意义。我们还决定运行8个安装程序是PITA,因此我们设计了一种从源代码控制手动安装所有必需软件包的简便方法。

主要考虑因素

  • 如果可以访问对象和/或源文件,构建环境不需要任何安装的软件包
  • 如果开发人员能够相当容易地确保他们在必要时使用相同版本的第三方库进行构建,这将有所帮助。
  • 但是,开发环境通常必须将软件包安装到IDE中。
    • 这有时会导致源兼容性问题。
    • 例如,写入IDE维护文件的新属性。
    • 当然这让我们回到第二点。
  • 由于第三方软件包不经常更新,因此它们位于源控制区域略有不同的区域。
  • 但是, NB 仍必须通过相对路径引用。

我们创建了以下文件夹结构:

...\ThirdParty\_DesignTimePackages //The actual package files only are copied here
...\ThirdParty\_RunTimePackages //As above, for any packages "required" by those above
...\ThirdParty\Suite1
...\ThirdParty\Suite2
...\ThirdParty\Suite3

因此,配置新环境非常容易:

  • 获取所有ThirdParty文件的最新版本。
  • 将_DesignTimePackages和_RunTimePackages添加到Windows路径
  • 打开Delphi
  • 选择安装组件
  • 从_DesignTimePackages中选择所有包。
  • 完成!

编辑:Darian担心切换设计包的切换版本时可能会出错。但是,这种方法避免了这些问题。

  • 通过将_DesignTimePackages和_RunTimePackages添加到Windows路径,Delphi将始终在同一位置找到所需的包。
  • 因此,您不太可能遇到不兼容版本的“包噩梦”。
  • 当然,如果你做一些愚蠢的事情,比如重建一些包裹并签入新版本,你可能会遇到问题 - 不管你采取什么方法。

答案 2 :(得分:2)

我通常在SVN中构建我的存储库,如下所示:

/trunk/app1
/trunk/comp/thirdparty1
/trunk/comp/thirdparty2
/trunk/comp/thirdparty3...

我在根文件夹(trunk)中包含一个包含所有组件的项目组(旧的delphi上的.groupproj或.bpg)。 (allcomponents.groupproj)。

在新机器上安装意味着打开该软件包并安装设计时组件。这对于早于2010年的所有Delphi版本来说都是拖累,但2010和XE有一个很好的功能,所以你可以一目了然地看到哪些组件是设计时组件。

我有时会通过制作build.bat文件和regcomponents.bat文件来省去手动安装这些组件的麻烦。 regcomponents只运行regedit,并在build.bat构建它们之后导入注册所有这些组件所需的密钥,以及其他所有组件。

当你从一个delphi版本升级到另一个版本时,同时拥有一个批处理文件和一个reg文件以及一个组项目可以帮助你。特别是如果你必须经历并大量打开项目/包并将它们保存为MyComponent3.dpk而不是MyComponent2.dpk,或者将包扩展名从150更新为160,或者将包更新。