如何评估 $(BDS) 等 Delphi 的“环境变量”?
Posted
技术标签:
【中文标题】如何评估 $(BDS) 等 Delphi 的“环境变量”?【英文标题】:How are Delphi 'environment variables' such as $(BDS) evaluated? 【发布时间】:2011-10-15 18:20:46 【问题描述】:我正在为我们的内部库制作一些整洁的安装程序(而不是仅仅打开 DPK 并单击“安装”然后一团糟......)这使我不得不了解如何在各种Delphi 变量如Known Packages、注册表 RootDir 值等。
我看到在 Delphi 中有许多变量可以使用(例如在搜索路径中),例如 $(BDS) 等。当我查看我的机器环境变量时,我在系统中都看不到这些或当前用户。
我的问题是:
-
Delphi 是否在内部做一些事情来扩展 $(BDS) 等本身?或者我可以以某种方式在外部使用这些(例如在注册表中查找)。
为什么在搜索路径中使用符号 $(xxxx) 而不是环境变量中的 %xxxx%?
谢谢
【问题讨论】:
【参考方案1】:1) 它们只是 Delphi 为自己的进程设置的环境变量,您可以使用 GetEnvironmentStrings 从安装在 IDE 中的设计包中检索它们;这里是an example。
如果您的安装程序是一个单独的可执行文件,您仍然可以(或多或少可靠地)猜测从何处获取某些值:
BDS
:RootDir
注册表中的值,例如HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\8.0\
BDSCOMMONDIR
:在旧版本中(我猜是 Delphi 2007),这是一个全局环境变量,由 Delphi 安装程序设置。在以后的版本中,您可以在rsvars.bat
中找到它。
其他一些可能是派生出来的,例如:
BDSLIB
: $(BDS)\lib
BDSINCLUDE
: $(BDS)\include
用户定义的变量(在 Delphi 的环境选项对话框中定义)存储在 Environment Variables
注册表子项中。
2) 恕我直言,$(...)
表示法更好,因为它具有不同的开始和结束分隔符,更容易用于搜索/替换操作,并且更具可读性。
【讨论】:
遗憾的是它们只能在 IDE(衍生?)进程中使用......仍在寻找默认值,但我怀疑它们可能只是硬编码到 BDS 和 DCC32可执行文件... :( @Marjan:为什么它们会出现在其他任何地方?它们可能是相对于正在运行的 BDS.exe 生成的,并且在进程之外毫无意义,因为您可以安装多个 BDS。您可能会找到的最佳持久位置是卸载注册。 @Craig:因为它们在更多情况下有用,而不仅仅是 IDE。如果它们可以在构建服务器中重复使用,那就太好了。现在您还必须在其中复制这些类型的设置。 rsvars.bat 会在你的 shell 中安装所有的变量。【参考方案2】:我正在研究一些命令行构建自动化(因为我想离开 Final Builder),所以我不得不处理那些特殊的变量。要调用命令行编译器,我们应该使用“开始”菜单中的“RAD Studio 命令提示符”调用命令提示符,或者将“rsvars.bat”脚本包含到我们自己的脚本中。
rsvars.bat 脚本如下所示:
@SET BDS=C:\Program Files (x86)\Embarcadero\RAD Studio\7.0
@SET BDSCOMMONDIR=C:\Users\Public\Documents\RAD Studio\7.0
@SET FrameworkDir=C:\Windows\Microsoft.NET\Framework\v2.0.50727
@SET FrameworkVersion=v2.0.50727
@SET FrameworkSDKDir=
@SET PATH=%FrameworkDir%;%FrameworkSDKDir%;%PATH%
@SET LANGDIR=EN
您可以注意到,其中设置了非常特殊的 BDS 变量以及其他一些变量。 BDS 路径与 Registry 中的 BDS 安装路径相对应,但我决定从rsvars.bat
脚本中读取它,希望它会更面向未来。因此,我实际上是将.bat
文件读入TStringList
,并应用一个简单的正则表达式来识别分配。
我扩展这些$(Nam)
样式表达式的例程包括DELPHI
名称的特殊情况,以处理Delphi7:如果我看到了,我将其替换为IDE 的安装路径。
【讨论】:
有趣,谢谢。 “我正在研究一些命令行构建自动化(因为我想离开 Final Builder)” - 你在做什么,你在做什么!!!!!!听起来很有趣。 我也尝试过在各个方面构建自己的小构建器。我建议只迁移到 Delphi 2007 或更高版本,并使用 MSbuild。挺不错的。 @Warren:是的,我在 bin 文件夹中也发现了“CodeGear.Delphi.Targets”,该文件夹中有几个用户已修改。 @Warren,我需要支持 Delphi 7、2010 和 XE,我的目标是更接近 Final Builder 功能(即:从实际的 Delphi 构建到上传完成的安装工具包到我们的“测试版”文件服务器)。我已经使用 Final Builder 很长时间了,但我总是为各种特殊功能编写小型控制台应用程序,然后从 FB 脚本中调用这些应用程序。这次我的目标是使用 dwscript(Delphi Web 脚本)自动化我的脚本,我已经完成了实际的 Delphi 构建,将其余部分放在一起只是时间问题。【参考方案3】:变量的 $() 表示法是 MAKE 使用的约定,Borland 在切换到 MSBuild 之前将其用作构建工具。 (在 D2007 中?)
【讨论】:
是的,完全正确。我真的很惊讶人们在这里谈论“构建服务器”,但不知道make
。更正一点:语法不是 broland 发明的,但在 broland 之前就已经很普遍了。
当然,pmake 和 gmake 也使用它。 IIRC 也有一些 shell(tcsh?)。
@PrematureOptimization +1 用于 Broland 错字;)【参考方案4】:
David 说得对,这些变量是 Delphi(和 C++ Builder)特有的,它们不能作为“普通”环境变量使用。
但是,可以在注册表中查找它们。关键是:HKCU\Software\<Borcadero>\BDS\<version>\Environment Variables
。
您添加的任何自定义“环境”变量也可以在此处找到。例如,我有一个 $(MVC) 变量指向可以找到所有组件('版本)的文件夹。
在工作中,我们使用注册表查找脚本/应用程序组合中的值,以将 dprojs 转换为使用命令行编译器的构建服务器的 cfg 文件。 (由于我们没有在构建机器上使用 IDE,所以我们手动将自定义的 Delphi 环境变量添加到注册表中。
更新
实际上,Environment Variables 键用于用户定义的环境变量和“标准”BDS 环境变量的覆盖。在注册表中找不到任何 $(BDS*) 环境变量的默认值...
因此,目前的知识表明,如果您想掌握 $(BDS*) 变量的值,则必须覆盖默认值并读取您从 Environment Variables 键中指定的值。
【讨论】:
AFAIK,Environment Variables
子键用于用户定义的变量。对于 Delphi XE,我没有在注册表中的任何位置看到 BDSLIB
定义。 HKEY_CURRENT_USER
和 HKEY_LOCAL_MACHINE
都没有。
@TOndrej:你是对的,虽然 $(BDS*) 的默认值的覆盖也可以在那里找到,所以你应该总是看那里。 $(BDS) 的值位于:HKCU\Software\<Borcadero>\BDS\<version>\RootDir
。正在寻找其他人...
否定。 David 是不对的,这些只是环境变量,由进程设置并(自然)由孩子继承。
@Downvoter:是的,它们是环境变量,由 IDE 设置,因此只能由 IDE 或由 IDE 启动的进程访问。它们不是“简单的环境变量”,因为它们在 IDE 进程树之外不可用。所以 David 完全正确地说它们是 Delphi 特有的,即使 Delphi 选择使用环境变量来实现它们。
@Downvoter:哦,不用担心,这不是我的本性。 “不!”的意思虽然不是你确认的......请按照预期的方式进行:善良。你向我证实的是,你显然需要每个人都表现出你所展示的同样的严谨性。它让我想起了大约 10 到 15 年前的我。现在我稍微宽容了一点...... :-)【参考方案5】:
谢谢,我想我会补充一点,当我创建一个新的环境变量 - (在我的 DCC_UnitSearchPath 中用作 $(VISEMS) )时,我观察到它被放入了注册表中。
对于一个具体的例子,我发现它在: 计算机\HKEY_CURRENT_USER\Software\Embarcadero\BDS\17.0\环境变量
上面的“接受的答案”需要更新以反映注册表路径中有版本号,因为在我的情况下,“接受的答案”不正确(当它说:HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\ 8.0\) 因为我的电脑上没有安装 8.0,所以“BDS\8.0”没有任何内容。
【讨论】:
此信息包含在该问题的已接受答案中,该问题已于近 9 年前发布,位于最后一段的下一段。这也在 Marjan 的回答中(就在这个回答之上)。 你假设我是那个投反对票的人——我不是。我礼貌地指出,您的回答重复了已经发布的内容,现在仍然如此。以上是关于如何评估 $(BDS) 等 Delphi 的“环境变量”?的主要内容,如果未能解决你的问题,请参考以下文章