【问题标题】:Best practices for using SVN with Delphi Visual Component packages?将 SVN 与 Delphi Visual Component 包一起使用的最佳实践?
【发布时间】:2011-03-24 16:03:59
【问题描述】:

希望能够重现使用 3rd 方可视化组件包的项目的给定修订版,SVN 中有哪些内容以及实施/构建 SVN 存储库的最佳方式是什么?

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

可视化包似乎与易于进行版本控制背道而驰,因为它们可能必须在每个修订版中重新安装。如何最好地创建一个能够在以后以特定修订号重新创建的 SVN 项目......有推荐的解决方案吗?

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

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

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

谢谢,

达里安

【问题讨论】:

  • 恕我直言,第三。派对组件包,无论是否可视,都是一样的,因为它们必须安装在 IDE 中才能工作。例如 INDY 或 JCL 甚至 JVCL(视觉和非视觉的混合)就是这种情况,仅举几个流行的非视觉。
  • 如果你没有使用运行时包构建并且有源代码,那么指向源代码是一个简单的路径问题。所以在这种情况下,运行时包(带有源)更容易处理。
  • 这并不能解决从 svn(或任何版本管理)检索特定版本的问题,包括第三方组件。
  • 我的想法与 jachguate 类似。也许更合适的区别是设计时与纯粹的运行时包。
  • @Leonardo,如果您将 VM 称为不是从 SVN 检索特定版本的解决方案,那么您是正确的。在这一点上,我只是没有另一个可行的想法。它比我们目前拥有的要好,但肯定不是“理想的” 理想的可能是 VMWare LabManager,但这很高 $$

标签: delphi svn version-control


【解决方案1】:

您可以为您的项目准备“启动 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

基本上,当您从注册表中转储当前工作配置,将其从不必要的键中剥离,将路径更改为相对路径,然后进行调整以使其适用于您的项目时,会更容易。

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

【讨论】:

  • 我在这些方面使用了一些东西。至少它可以让你轻松地为各种目的重新配置 Delphi。
  • 您现在使用这种设置吗?听起来确实很有趣。然后“环境”将是一个项目(reg script + bpls)并且也被版本化......这可能是使用它们的项目中特定环境修订版的“svn-external”。然后随着环境的变化(Delphi 服务包、组件添加或更新),环境将单独提交,并根据需要升级引用项目。 (使用 svn-external 总是引用一个特定的 rev #)嗯……这确实打开了很多东西!需要咀嚼一段时间......谢谢。
  • 我在很多项目中都使用了这个设置,构建脚本是在每个项目的基础上准备的。不幸的是,它不处理 Delphi 补丁——但 Delphi 是唯一需要安装在机器上的依赖项,除了 TortoiseSVN(或 TortoiseGIT)和一些受版权保护的库,Woll2Woll 的 InfoPower 是我所知道的唯一一个抱怨不正在使用安装程序安装在系统中,方法是...在加载时挂起 IDE。为他们感到羞耻。
  • 你的解决方案,加上这篇帖子dummzeuch.de/delphi/subversion/english.html的一些附加逻辑
  • 我喜欢这种为每个项目定制 IDE 的想法。不幸的是,这些变化是永久性的。也许有人可以提供一个工具来将注册表访问重定向到一个文件,然后该文件将成为项目的一部分?我有一些用于挂钩 Delphi 2007 IDE 的注册表访问的示例代码,但我不知道它是否仍然适用于较新的版本。
【解决方案2】:

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

叹息,曾经有一段时间整个应用程序(设置和所有)都存在于单个目录中 - 这不是问题。但是,世界在发展,我们的应用程序的各个部分散落在各处:

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

您认为修补程序/服务包的影响是完全正确的。不仅 RTL/VCL 可能会受到影响,而且编译器本身也可能会稍有改变。还要注意,以同样的思路运行,即使升级 Delphi 版本,也需要使用正确的版本进行构建。诚然,这更容易一些,因为您可以同时运行不同的 Delphi 版本。

但是,我建议您可能不值得付出太多努力。 请记住,使用旧版本总是比使用当前版本更昂贵。

  • 理想情况下,您希望所有开发都位于主分支代码上,并且希望尽量减少旧版本上的补丁工作。
  • 因此,请尽可能让您的大多数用户使用最新版本。
  • 诚然,这并不总是可行的。
  • 在任何情况下,您都不想在没有先进行一些测试的情况下跳到“新版本”。
  • 某些敏捷流程确实倾向于使这更容易。
  • 通过使用单独的构建机器或虚拟机,您已经有了一定程度的控制。
  • 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.
  • 推出修补程序/服务包后,应积极劝阻对旧版本的修复。
  • 当然,它们可能无法消除,但如果足够少,那么手动重新配置也是可行的。
  • Instead of a VM option to keep your old configuration, you can also consider drive-imaging.
  • 要节省 VMWare LabManager 的 $$$,请寻找命令行驱动的 VM 播放器。
  • 您可能需要保留 2 台“活动”机器/VM,但绝不应该需要更多。
  • 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

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

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

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

  • 通过将 _DesignTimePackages 和 _RunTimePackages 添加到 Windows 路径,Delphi 将始终在同一位置找到所需的包。
  • 因此,您不太可能遇到不兼容版本的“软件包噩梦”。
  • 当然,如果您做了一些愚蠢的事情,例如重建一些软件包并签入新版本,那么无论您采用哪种方法,您都可能会遇到问题。

【讨论】:

  • 我知道Delphi 5的痛苦!感谢您的详细回复。
  • 在之前加载的设计包从一个版本切换到另一个版本时不会出现错误吗?
【解决方案3】:

我通常像这样在 SVN 中构建我的存储库:

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

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

在新机器上安装意味着打开该软件包并安装设计时组件。这对所有早于 2010 年的 Delphi 版本都是一种拖累,但 2010 和 XE 有一个可爱的功能,因此您可以一眼看出哪些组件是设计时组件。

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

当您从一个 delphi 版本升级到另一个版本时,最好同时拥有一个批处理和 reg 文件以及一个小组项目来帮助您。尤其是如果您必须执行大量打开项目/包并将它们保存为 MyComponent3.dpk 而不是 MyComponent2.dpk,或者将包扩展名从 150 更新到 160,或者您的包所做的任何事情。

【讨论】:

  • 那么,对于以不同版本共享第三方 3 的 app2,您是否也有卸载批处理文件? (卸载 rev x,安装 rev y)
  • 通常不会,因为“卸载”只是意味着删除我的第三方组件文件夹,然后启动 delphi,然后单击“否”,或者是“是”,很多。
猜你喜欢
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2015-11-12
  • 1970-01-01
  • 2022-06-22
  • 2010-11-28
相关资源
最近更新 更多