2012-10-06 42 views
2

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

如果我运行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 
+0

他们有相同的输出路径。完全清除构建或完全不同的输出路径将是我的第一个猜测。 –

+2

你是否从相应的Rad Studio命令提示符(它应该设置正确的环境)运行脚本? – kludg

+0

Tony:我在构建之前尝试了一次/ t:clean,没有任何区别。我认为清除一切。 –

回答

0

我回到我怀疑它是表单文件资源。

我的理论是,用'错误'版本的IDE保存的表单文件,当用不同版本构建的项目试图加载它们时,我得到访问冲突,因为应用程序试图加载数据在该版本中不可用的属性。

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

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

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

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

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

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 

的哈克的方式来解决它是设置的路径是这样的:

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

请使用优雅的方法!


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

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

+0

+1有很好的修正,但它还没有解决原来的问题。 –

+2

嗯,这是我能做的最好的。你没有显示任何详细的错误信息,所以我没有想法。 –

0

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

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

该文件间接包含在您的项目中。所以如果你运行说XE2's IDE然后编译你的XE3应用程序,你会得到错误的路径。

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

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

这是我最好的猜测。对不起,如果它太晚了5年。我刚刚遇到类似的问题!

所有最优秀的

史蒂夫