2011-04-21 74 views
8

我必须维护用Delphi编写的旧软件。源代码树是一个真正的混乱。我试图做2件事:制作清晰的目录结构并设置自动构建过程。第三方组件的项目目录结构

现在,我已经产生下面的目录树

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

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

我的方法有一点缺陷。我无法从新电脑开始,从我的回购库中签出验收码,开始构建脚本并准备好使用项目的分配。我需要先打开IDE,安装必需的组件(例如,RXLibMemoEx),设置库路径等。只有在这些步骤之后,我才能运行我的构建脚本。

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

问题

  1. 有什么办法来重新安装组件在德尔福7从命令行?有没有办法做到这一点没有硬编码D7的安装路径?
  2. 如何将第三方零部件代码存储在项目树中?
  3. 我应该在什么地方放置bpldcu,这些零部件将在生产过程中生产。我应该把它们放在Project\build\output吗?或者将输出放置到另一个位置会更好(不要覆盖Delphi设置),但是在项目配置中更改Library路径?

回答

4

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

你不能真正从命令行安装,但它很容易建立一些 那样做。您可以使用DCC32.EXE编译软件包。

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

2007年德尔福 HKEY_CURRENT_USER\Software\Borland\BDS\5.0\Known Packages 德尔福XE 'HKEY_CURRENT_USER \ SOFTWARE \ Embarcadero公司\ BDS \ 8.0 \已知套餐'

我们使用的FinalBuilder,之后我们建立所有第三方组件更新此。 它可以让每个开发者保持同步。

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

根目录...

C:\dev\trunk\ 

这让我在一个简单的格式创建分支。

C:\dev\branch1\ 

从那里我做到以下几点:

我用\斌\ DCU公共目录,因为我做了很多包的发展,其 许多需要在设计时加载。这可以防止为了保持Delphi的快乐而将许多 目录添加到系统路径。

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

的每一个项目,我这样做,虽然我常常放置多个项目在同一 目录,如果依靠:

\output\DelphiXE\Bin 
\output\DelphiXE\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的每一件事情。

顶部这一关我创建

℃的环境变量:\ DEV \行李箱\

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

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

那么如果我要转换分支我可以改变使用该版本的代码库的环境变量重新推出Delphi和一切。

+0

好的信息。这是我保留意义的工具。然后我去看看这样开始的JVCL安装程序,我想,也许我会修改JVCL安装程序。 – 2011-05-06 19:00:32

6
  1. 你只需要编译包与德尔福命令行编译器。如果Delphi bin路径位于您的PATH中,则不必对installtion路径进行硬编码。如果你的构建系统能够从注册表中读取,你会得到如下路径HKEY_LOCAL_MACHINE\SOFTWARE\CodeGear\BDS\6.0\RootDir(德尔福2009在这种情况下)。

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

  3. 从我的经验来看,最好的练习是让他们在德尔福的目的地(取决于德尔福版本)。

+0

如果您推荐将'components'作为子模块(以mercurial的形式进行subrepos),那么最好将'dcu'和'bpl'存储在它们的回购站内。不是吗?在其他情况下,有时它会使另一个使用相同组件但另一个版本的应用程序的构建过程搞糟。 – Alik 2011-04-21 21:17:55

+0

我的意思是,如果每个'component'将驻留在'component \ src'中,并且构建工具将'dcu'和'bpl'编译为'component \ build'。这些dcu和bpl文件将用于将组件安装到IDE(设计阶段)中。 与此同时,我的'project.dof'将被编辑为使用库路径'.. \ components \ component \ src'。在构建项目工具期间,将查找此目录并构建组件的单元以将其存储在'project \ build \ output'中。 – Alik 2011-04-21 21:21:55

+1

@Konstantin Mikhaylov,你对“安装组件”的看法可能有点偏离。组件作为软件包(DCP)安装,并且只有一个已安装软件包列表,该列表不是“每个项目”。打开项目时,组件不会被安装到IDE中,并且在关闭项目并打开另一个项目时它们不会被更改。事实上,Delphi IDE允许你一次打开多个项目!这就是为什么在我的回答中我说“没有项目拥有第三方组件”,所以我不建议将它们置于与实际项目本身相同的目录中的版本控制之下[...] – 2011-04-22 05:32:32

3

1:是的,没有,你可以设计自己组件,在命令行(其中“命令行”是指安装它们编程,如果你真的想命令行安装,您可能需要编写该工具)。第三方组件通常带有一个安装程序,它可以自行安装和注册组件。从理论上讲,您可以自动执行安装程序的所有操作,并基本上重新打包组件以供自己使用,但是您可能会遇到法律障碍。 2:第三方组件不绑定到项目。将这些文件存储在项目目录中并不是一个好主意。当您在其他项目中重复使用相同的组件时会发生什么?你是否将所有源文件复制到新项目中?对于我自己的工作,我已将所有第三方组件安装到一个文件夹中,与任何项目的目录分开,并将该文件夹保存在版本控制下。

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

+0

我怀疑是否有任何法律障碍,以自动方式安装组件。我们使用FinalBuilder来重建包括第三方组件的所有内容。然后我们写了一个脚本将它们安装到Delphi中。最大的原因是保持第三方组件的版本同步,10个不同的开发人员现在真的很容易... SVN更新。运行FinalBuilder脚本。 – 2011-04-22 17:04:09