2

我有一个项目需要构建两个可执行文件:一个在 Delphi XE2 下,一个在 XE3 下。我有一个构建每个版本的构建脚本(即一个用于 XE2 的脚本和一个用于 XE3 的脚本)。

如果我为我运行的最后一个版本的 IDE 运行构建脚本,一切正常(即运行 Delphi XE2、构建应用程序、运行 XE2 构建脚本)。

但是,如果我在运行不同版本的 IDE 后运行构建脚本,我会在我的应用程序启动后立即获得一个 AV(即运行 Delphi XE2、构建应用程序、运行 XE3 构建脚本)。

看起来构建脚本的某些内容正在被 IDE 缓存/修改,我需要为我想要构建的版本恢复适当的数据。我已经用 .dproj 试过这个,但没有运气。

或者它可能正在加载表单资源 - 如果 IDE 在启动时由于不存在的属性,两个版本都会显示错误。如果是这样,是否有一种简单的方法可以解决这个问题而无需维护所有 .fmx 文件的多个版本?

这是一个示例构建脚本:

set path=%path%;c:\Windows\Microsoft.NET\Framework\v3.5
set path=%path%;c:\Program Files (x86)\Embarcadero\RAD Studio\10.0
set path=%path%;c:\Documents and Settings\All Users\Documents\RAD Studio\10.0
set BDS=c:\Program Files (x86)\Embarcadero\RAD Studio\10.0
set FrameworkDir=c:\Windows\Microsoft.NET\Framework\
set FrameworkVersion=v3.5

set failed=false
cd \myprogs\monkeystyler
msbuild monkeystyler.dproj /t:build /p:config=full||set failed=true
cd build
if not %failed%==true goto Done

echo ****FAILED TO BULD MONKEYSTYLER
****
Pause
exit

:done
4

3 回答 3

7

让我们看一下 XE3 脚本中的这一行:

set path=%path%;c:\Program Files (x86)\Embarcadero\RAD Studio\10.0

我的猜测是您在 XE2 脚本中使用以下命令进行跟踪:

set path=%path%;c:\Program Files (x86)\Embarcadero\RAD Studio\9.0

此时您的路径变量如下所示:

set path=%path%;c:\Program Files (x86)\Embarcadero\RAD Studio\10.0;c:\Program Files (x86)\Embarcadero\RAD Studio\9.0

所以第二个脚本失败了,因为第一个脚本的路径出现得更早。

解决此问题的优雅方法是在您的脚本中使用setlocalendlocal将它们彼此隔离。

setlocal
set path=%path%;c:\Windows\Microsoft.NET\Framework\v3.5
set path=%path%;c:\Program Files (x86)\Embarcadero\RAD Studio\10.0
.....
endlocal

解决它的hacky方法是设置这样的路径:

set path=c:\Program Files (x86)\Embarcadero\RAD Studio\10.0;%path%

请使用优雅的方法!


此外,您应该使用 pushd 和 popd 来隔离每个脚本的目录更改。

如果这不能解决所有问题,请提供更多信息。首先,错误消息非常有用。

于 2012-10-06T16:53:19.520 回答
1

您运行的最后一个 IDE 将更新您<user>\AppData\Roaming\Embarcadero\BDS\<version>文件夹中的 EnvOption.proj。

这包含您的所有搜索路径等。

此文件间接包含在您的项目中。所以如果你运行 say XE2's IDEthen compile 你的XE3应用程序,你会得到错误的路径。

您可能希望禁用它并在每个项目的 dproj 文件中明确指定您的搜索路径。

e.g. msbuild myproj.proj /p:ImportEnvOptions=false

这是我最好的猜测。抱歉,如果晚了 5 年。我刚刚遇到过类似的问题!

一切顺利

史蒂夫

于 2017-09-10T11:05:51.177 回答
0

我重新怀疑它是表单文件资源。

我的理论是,由 IDE 的“错误”版本保存的表单文件,当使用不同版本构建的项目尝试加载它们时,由于应用程序试图加载属性数据而导致访问冲突在该版本中可用。

为了测试这一点,我在一个版本的 IDE(本例中为 XE3)中成功编译了项目,进行了自动构建并测试了应用程序是否运行(确实如此)。

然后我为该项目加载了一个 .fmx 文件,并在表单中添加了一个不存在的属性。

构建和应用程序失败与以前一样。

删除添加的属性,现在构建成功。

我现在需要做的所有(!)就是编写一些代码来解析表单文件并删除我正在构建的版本的任何不存在的属性。

于 2012-10-09T21:22:59.990 回答