具有 3rd 方组件的项目目录结构
Posted
技术标签:
【中文标题】具有 3rd 方组件的项目目录结构【英文标题】:Project directory structure with 3rd party components 【发布时间】:2011-08-10 13:39:03 【问题描述】:我必须维护用 Delphi 编写的旧软件。源代码树真是一团糟。我正在尝试做两件事:创建干净的目录结构并设置自动构建过程。
现在我已经生成了以下目录树
\项目 \构建\输出 \dist\发布 \dist\调试 \文档 \环境 \res \src
\src
目录包含*.pas
和*.dfm
文件和project.dpr
。各种资源(图标、图像和字体)位于\res
目录中。 \env
用于创建用于调试目的的各种环境。 IDE 设置为将 project.exe 构建到此目录中。
构建脚本存储在build
文件夹中。这些脚本在dcc32.exe
的帮助下在dist\release
和dist\debug
文件夹中生成产品分发(在exe 中包含和不包含调试信息)。 build\output
用于在 IDE 内部或构建脚本内部构建过程中保存 dcu 文件。
我的方法有一点缺陷。我无法从新计算机开始,从我的 repo 中签出代码,开始构建脚本并接收准备使用的项目分发。我需要先打开IDE,安装所需的组件(例如RXLib
和MemoEx
),设置库路径等等。只有在这些步骤之后,我才能运行我的构建脚本。
直到上周,这还不是什么大问题。我已经修改了第 3 方组件以修复错误(此组件不再维护 :-(),因此我必须将此组件的代码添加到我的项目结构中。此时如果我将从repo 我需要检查 3rd 方库的代码是否有变化。如果库的代码发生了变化,我需要重新编译组件并重新安装它们。
问题
-
有没有办法从命令行重新安装 Delphi 7 中的组件?有没有办法不用硬编码D7的安装路径?
如何在项目树中存储第三方组件的代码?
我应该将
bpl
和dcu
放在哪里,它们将在组件构建期间生成。我应该把它们放在Project\build\output
吗?或者最好将输出放置到另一个位置(不要覆盖 Delphi 设置),但在项目配置中更改库路径?
【问题讨论】:
【参考方案1】:您只需要使用 delphi 命令行编译器编译包。如果 Delphi bin 路径在您的 PATH
中,则您不必对安装路径进行硬编码。如果您的构建系统能够从注册表中读取,您将获得路径,例如HKEY_LOCAL_MACHINE\SOFTWARE\CodeGear\BDS\6.0\RootDir
(本例中为 Delphi 2009)。
我会为每个包添加另一个分支components
,其中包含子分支。不要将它们与您的项目混在一起。
根据我的经验,最好的做法是将它们保存在 delphi 目标位置(取决于 delphi 版本)。
【讨论】:
如果您建议将components
添加为子模块(就 mercurial 而言是子存储库),那么最好将 dcu
和 bpl
存储在其存储库中的某个位置。不是吗?在其他情况下,有时它会搞砸另一个使用相同组件但另一个版本的应用程序的构建过程。
我的意思是如果每个component
都驻留在component\src
中并且构建工具将编译dcu
和bpl
到component\build
。这些 dcu 和 bpl 文件将用于将组件安装到 IDE(设计时)。与此同时,我的 project.dof
将被编辑为使用库路径 ..\components\component\src
。在项目构建期间,工具将查找此目录并将组件的单元构建到 dcu 并将它们存储在project\build\output
。
@Konstantin Mikhaylov,您对“安装组件”的看法可能有点偏离。组件作为包(DCP)安装,并且只有一个已安装包的列表,该列表不是“每个项目”。当您打开一个项目时,组件不会安装到 IDE 中,当您关闭项目并打开另一个项目时,它们也不会更改。事实上,Delphi IDE 允许您一次打开多个项目!这就是为什么在我的回答中我说“没有项目拥有 3rd 方组件”,所以我不建议将它们置于与实际项目本身相同的目录中的版本控制下 [...]
@Konstantin Mikhaylov,[...] 如果 3rd 方组件不是项目的一部分,那么您就不会有将 3rd 方组件与项目中使用的组件匹配的问题。实际上你这样做,但它不能作为项目的一部分来解决。一旦解决了这个问题,您可能需要重新考虑将 DCU 和 BPL 文件存储在 Mercurial 中的选项。我也在使用 Mercurial,它是炉排;但它不喜欢二进制文件,DCU、BPL、EXE都是二进制文件。我不将它们存储在 VCS 中。作为任何版本的一部分,我总是在做“全部构建”,所以 DCU 没有任何价值。【参考方案2】:
1:是和否,您可以设计您自己的组件以从命令行安装(其中“从命令行”意味着以编程方式安装它们,如果您真的想要命令行,您可能需要编写工具)。 3rd 方组件通常附带一个安装程序,该安装程序比安装和注册组件本身做的更多。从理论上讲,您可以自动化安装程序所做的所有事情,并从本质上重新打包组件以供您自己使用,但这样做可能会遇到法律障碍。
2:第 3 方组件与项目无关。将这些文件存储在项目目录中并不是一个好主意。当您在其他项目中重用相同的组件时会发生什么?您是否将所有源文件复制到新项目中?对于我自己的工作,我将所有 3rd 方组件安装到一个文件夹中,与任何项目的目录分开,并且我将该文件夹置于版本控制之下。
3:为每个项目使用单独的输出目录是个好主意,它使条件编译的使用更加容易。我建议 Debug 和 Release 使用单独的输出目录。关于第 3 方 BPL,它们也不是项目的一部分,因为没有一个项目“拥有它们”。
【讨论】:
我怀疑自动安装组件是否存在任何法律障碍。我们使用 FinalBuilder 重建包括 3rd 方组件在内的所有内容。然后我们编写了一个脚本将它们安装到 Delphi 中。最大的原因是让 3rd 方组件的版本在 10 个不同的开发人员之间保持同步现在真的很容易...... SVN 更新。运行 FinalBuilder 脚本。【参考方案3】:更新:注意到从命令行请求安装部分问题。
您不能真正从命令行安装,但构建一些东西会很容易 那就是这样做的。您可以使用 DCC32.EXE 编译这些包。
组件的安装由注册表项控制。每个版本的 Delphi 在注册表中的位置都不同,但它遵循相同的基本模式。 例子:
德尔福 2007
HKEY_CURRENT_USER\Software\Borland\BDS\5.0\Known Packages
德尔福 XE
'HKEY_CURRENT_USER\Software\Embarcadero\BDS\8.0\Known Packages'
在我们构建完所有第 3 方组件后,我们使用 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...
finally 用于不同项目通用的组件和代码。
\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 以及使用该版本代码库的所有内容。
【讨论】:
很好的信息。这是我一直想要构建的那种工具。然后我去看看 JVCL 安装程序是这样开始的,我想,也许我会修改 JVCL 安装程序。以上是关于具有 3rd 方组件的项目目录结构的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法以编程方式为 iOS 上的 3rd 方应用程序获取 UI 层次结构?