具有第三方组件的项目目录结构

时间:2011-04-21 19:28:58

标签: delphi components build-automation project-structuring

我必须维护用Delphi编写的旧软件。源树真是一团糟。我正在尝试做两件事:制作干净的目录结构并设置自动构建过程。

现在我已经制作了以下目录树

  \Project
     \build\output   
     \dist\release
     \dist\debug
     \doc
     \env
     \res
     \src

\src目录包含*.pas*.dfm个文件以及project.dpr。各种资源(图标,图像和字体)驻留在\res目录中。 \env用于创建各种环境以进行调试。 IDE已设置为将project.exe构建到此目录中。 构建脚本存储在build文件夹中。这些脚本在dist\release的帮助下在dist\debugdcc32.exe文件夹中生成产品分发(在exe中有和没有调试信息)。 build\output用于在IDE内部或构建脚本内部的构建过程中保存dcu文件。

我的做法有一点缺陷。我不能从新的计算机,我的仓库的结账代码开始,开始构建脚本并接收准备使用项目的分配。我需要先打开IDE,安装所需的组件(例如RXLibMemoEx),设置库路径等等。只有在那些步骤之后我才能运行我的构建脚本。

直到上周才出现这个问题。我修改了第三方组件以修复错误(此组件不再维护:-(),所以我必须将此组件的代码添加到我的项目结构中。此时如果我将从我需要检查repo是否有第三方库的代码更改。如果库的代码被更改,我需要重新编译组件并重新安装它们。

问题

  1. 有没有办法从命令行在Delphi 7中重新安装组件?如果没有硬编码D7的安装路径,有没有办法做到这一点?
  2. 您如何在项目树中存储第三方组件的代码?
  3. 在构建组件期间,我应该在哪里放置bpldcu。我应该把它们放在Project\build\output吗?或者最好将输出放到另一个位置(不要覆盖Delphi设置),但是在项目配置中更改库路径?

3 个答案:

答案 0 :(得分:6)

  1. 您只需使用delphi命令行编译器编译包。如果Delphi bin路径在您的PATH中,则您不必对安装路径进行硬编码。如果您的构建系统能够从注册表中读取,您将获得路径,例如HKEY_LOCAL_MACHINE\SOFTWARE\CodeGear\BDS\6.0\RootDir(本例中为Delphi 2009)。

  2. 我会为每个包添加另一个分支components和子分支。不要将它们与您的项目混合。

  3. 根据我的经验,最好的方法是将它们保存在delphi目的地(取决于delphi版本)。

答案 1 :(得分:4)

更新:注意到从命令行安装请求部分问题。

您无法从命令行安装,但构建内容很容易 那样做了。您可以使用DCC32.EXE编译包。

组件的安装由注册表项控制。对于每个版本的Delphi,注册表中的位置都不同,但它确实遵循相同的基本模式。 例子:

Delphi 2007 HKEY_CURRENT_USER\Software\Borland\BDS\5.0\Known Packages 德尔福XE 'HKEY_CURRENT_USER \ Software \ Embarcadero \ BDS \ 8.0 \ Known Packages'

在我们构建了所有第三方组件之后,我们使用FinalBuilder更新了这个。 它使每个开发人员保持同步变得更容易。

至于目录结构,我预先考虑版本控制并执行以下操作。

根目录...

C:\dev\trunk\

这允许我以简单的格式创建分支。

C:\dev\branch1\

从那里我做以下事情:

我使用\ Bin和\ DCU的公共目录,因为我做了很多包开发 其中许多需要在设计时加载。这可以防止必须添加许多 系统路径的目录,以保持Delphi的快乐。

\output\DelphiXE\Bin
\output\DelphiXE\Dcu

如果需要这样可以增强:

\output\DelphiXE\Release\Bin
\output\DelphiXE\Release\Dcu
\output\DelphiXE\Debug\Bin
\output\DelphiXE\Debug\Dcu

对于每个项目,我这样做,虽然我经常在同一个项目中放置多个项目 目录如果依赖大多数相同的代码。

\project\ (DPR/DPK Here)
\project\source (if the project is small, if not I break it out further)
\project\forms\
\project\classes\
\project\datamodules\
\project\resources\
\project\install\ (Install Scripts)
etc...

最终用于不同项目的组件和代码。

\Commonlib\ (Directory for my code that common among projects)
\Components\3rdPartyName\
\Components\3rdPartyName2\
\Components\3rdPartyName3\

我是这样做的,所以我知道我的应用程序的X版本只需使用版本控制版本号即可。

为此,我为

创建了一个环境变量

C:\ DEV \ TRUNK \

然后我在系统库路径中使用环境变量。 像这样:

%MYCODE%components\3rdParty1;%MYCODE%components\3rdParty2\

然后,如果我必须切换分支,我可以更改环境变量重新启动Delphi以及使用该版本代码库的所有内容。

答案 2 :(得分:3)

1:是和否,您可以从命令行设计您自己的组件(其中“从命令行”意味着以编程方式安装它们,如果您真的需要命令行,那么您可能需要编写工具)。第三方组件通常附带一个安装程序,该安装程序会执行更多操作并自行安装和注册组件从理论上讲,您可以自动执行安装程序所做的一切,并基本上重新打包组件供您自己使用,但您可能会遇到法律障碍。

2:第三方组件与项目无关。将这些文件存储在项目目录中并不是一个好主意。当您在其他项目中重用相同的组件时会发生什么?您是否将所有源文件复制到新项目?对于我自己的工作,我已将所有第三方组件安装到一个文件夹中,与任何项目的目录分开,并且我将该文件夹保留在版本控制之下。

3:为每个项目使用单独的输出目录是个好主意,它使得使用条件编译变得更加容易。我建议为Debug和Release分别输出目录。关于第三方BPL,它们也不属于该项目,因为没有一个项目“拥有它们”。