如何评估 $(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。

如果您的安装程序是一个单独的可执行文件,您仍然可以(或多或少可靠地)猜测从何处获取某些值:

BDSRootDir 注册表中的值,例如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_USERHKEY_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 的“环境变量”?的主要内容,如果未能解决你的问题,请参考以下文章

打开Delphi 10.1 berlin提示脚本错误的解决方法

Delphi 中的单元测试——你是怎么做的? [关闭]

Delphi中if语句的评估顺序

打开Delphi 10.2提示脚本错误的解决方法

怎么设置禁止delphi Xe2 自动检查更新

房产交易评估基准价格比对-Delphi外挂方式获取并修改其他程序输入框信息