我们通过“工具|选项|环境变量”这样的变量创建:
$(Sources) = D:\Sources\Delphi
$(OurLib) = $(Sources)\OurLib\Src
$(OurApp1) = $(Sources)\Applications\App1\3.x
$(ThirdParty) = $(Sources)\ThirdPartyComponents
我们在项目搜索路径中使用这些变量:
($OurApp1)\Src\Core;($OurApp1)\Src\GUI;($OurApp1)\Src\Plugins;$(ThirdParty)\JVCL
但是自Delphi 2009以来,这已被打破(同时也已修复),因为这些变量不再被完全评估(参见QC #73276)。因此编译器找不到目录中的文件。解决方法:仅使用环境变量中的完整目录。
我们使用这种方法,因为在所有开发人员机器和构建服务器上都可以找到文件,我们只需要将$(Sources)指向正确的位置。
我们的全局库路径中没有任何内容(Delphi默认值除外),因为它不在版本控制中,也不会反映在其他开发人员或构建机器上。
一个问题是:如果$(OurLib)中的一个单元决定在新路径中包含另一个新单元,则所有项目都会中断,因为它们找不到这个新单元。然后我们必须完成所有项目并添加搜索路径。 (顺便说一下:我真的很讨厌搜索路径编辑器...这个简单的备忘录字段比编译这个替换/添加/删除逻辑要好得多吗?)
我们做的另一件事是不向项目中添加很多单元。特别是来自$(OurLib)的所有东西,但我们经常有像插件这样的单元,只有通过包含它们才能增加功能。对于我们产品的不同版本,我们希望包含不同的单位。由于Delphi总是在.dpr中的uses子句中弄乱$ IFDEF,我们通过包含名为“IncludePlugins”的单元帮助我们,然后包含依赖于IFDEF的单元。 但是不包括项目中的单位会导致痛苦。单位没有出现在项目中,按Ctrl + 12(显示单位)找不到它们,它们没有显示在代码完成等中。
有没有人有更好的方法来应对这些问题?
答案 0 :(得分:2)
我们使用标准驱动器映射。
我们当前的项目始终在W:无论是网络驱动器还是替代品。
这很有效。
当您需要处理其他项目时,请交换W:然后继续。
答案 1 :(得分:2)
我们只使用相对路径,当项目源代码驻留在src子目录中时,任何库总是在libs子目录下面。所以我们的搜索路径总是如下:
.. \库\ LIBRARY1; .. \库\ library2 \常见;
等
所有库都以svn:external的形式添加到每个项目中,因此检出项目也会自动检出库,搜索路径将始终指向该项目库的正确版本。
不完美,但大部分时间都有效。
我必须同意搜索路径编辑器,相对路径更糟糕,因为你不能使用“...”按钮,否则Delphi会插入绝对路径。
答案 2 :(得分:1)
您可以将搜索路径复制到编辑器,修改它然后将其复制回来。
答案 3 :(得分:1)
我一直觉得很奇怪,这从未得到充分解决。我最近向David I建议Delphi应该允许用户设置某种首选的开发结构,并且可以让第三方库发布者知道这一点,以便他们可以自动调整他们的安装程序以在首选开发框架中正确安装。如果首选开发结构存储在XML文件或类似文件中,那么它可以在开发团队中从一台计算机复制到另一台计算机。
作为替代方案,它可以创建一个有趣的项目来创建一个Delphi应用程序,允许用户以高级方式“重构”他们的库安装。您指定系统上的哪些文件夹包含源代码或已编译的组件,或者您希望保留源文件或编译单元的任何内容和位置,按Go键,系统会重新排列,同时更新Delphi环境,以便在启动Delphi时找到它它应该做的一切。
答案 4 :(得分:0)
您的搜索路径太大了。它应该只包含 你希望Delphi用你的项目重新编译的东西。你真的不想每天重新编译Jedi VCL,对吗?
我创建了一个所有编译单元的目录。说, C:\ dcu 。将其指定为所有包中的“单位输出目录”。那么,我的“搜索路径”总是就是这样:
$(Delphi)\Lib;C:\dcu
编译器找到它需要的一切,它永远不会找到任何源代码。它所见到的唯一源代码是直接属于我正在编译的任何项目的文件。项目自己的源目录不需要在搜索路径上,因为所有这些文件都已经是项目的直接成员。编译器确切地知道它们的位置。
对我来说,项目的所有源文件都放在一个目录中。如果你想要不同部分的单独目录,比如 Core 和 GUI ,那么我会将它们放在单独的包中,这样我就可以处理它们并单独编译它们。即使最终程序没有使用生成的BPL,包仍然是分割项目和定义依赖项的好方法。
当为一个项目编译单元不会自动为所有其他项目编译单元时,您将被迫更改活动项目。这需要花费一些时间,但它也可以提醒你“改变帽子”。
虽然您只生产一个产品,但这并不意味着您在Delphi中只需要一个项目。您的产品中每个可执行模块(EXE,DLL,BPL)至少应有一个项目。使用项目组在单个IDE会话中管理多个项目。任何单位都不应该是多个项目的成员。
我不了解您的插件和项目的不同版本。当你说“插件”时,我假设你在谈论客户可以选择包含或不包含的单独的可执行模块,如DLL或包。难道你不能将不同版本的功能转换为插件模块,而这些模块根本不包含在较小版本中吗?然后您不必担心项目的条件编译;只需要几个不同的安装程序包,它们可以获取不同的插件集。
答案 5 :(得分:0)
我刚刚发现了一种使用XE6在delphi版本中创建项目特定环境变量的方法,它不像C中那样完整的#define,但至少我现在可以拥有跨多个项目的一致搜索路径,并创建一些共享选项集。
我所做的是以与原始海报相同的方式设置环境变量,然后在dproj或optionset中覆盖它们。
添加到项目中的BuildPaths.optset看起来像
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SVN_Root>..\..\..</SVN_Root>
<SVN_Riemann>$(SVN_Root)\Riemann</SVN_Riemann>
<SVN_Library>$(SVN_Root)\Library</SVN_Library>
<SVN_ThirdParty>$(SVN_Library)\Third Party</SVN_ThirdParty>
</PropertyGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType>OptionSet</Borland.ProjectType>
<BorlandProject>
<Delphi.Personality/>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
</Project>