我有一个项目,我需要构建两个可执行文件:一个在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
答案 0 :(得分: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
因此第二个脚本失败,因为第一个脚本的路径出现得更早。
解决此问题的优雅方法是在脚本中使用setlocal
和endlocal
将它们彼此隔离。
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来隔离每个脚本的目录更改。
如果这不能解决所有问题,请提供更多信息。首先,错误消息非常有用。
答案 1 :(得分:1)
您运行的最后一个IDE将更新<user>\AppData\Roaming\Embarcadero\BDS\<version>
文件夹中的EnvOption.proj。
这包含所有搜索路径等。
此文件间接包含在您的项目中。因此,如果您运行说XE2's IDE
然后编译您的XE3
应用,您将得到错误的路径。
您可能希望禁用它并在每个项目的dproj文件中明确指定搜索路径。
e.g. msbuild myproj.proj /p:ImportEnvOptions=false
这是我最好的猜测。对不起,如果它已经晚了5年。我刚刚遇到类似的问题!
一切顺利
史蒂夫
答案 2 :(得分:0)
我又回到了怀疑它是表单文件资源。
我的理论是,使用IDE的“错误”版本保存的表单文件,当使用不同版本构建的项目尝试加载它时,由于应用程序尝试加载属性数据而导致访问冲突哪个版本没有。
为了测试这个,我在IDE的一个版本(在本例中为XE3)中成功编译了项目,完成了我的自动构建并测试了应用程序运行(确实如此)。
然后我为项目加载了一个.fmx文件,并在表单中添加了一个不存在的属性。
构建和应用程序与以前一样失败。
删除添加的属性,现在构建成功。
我现在需要做的所有(!)是编写一些代码来解析表单文件并删除我正在构建的版本的任何不存在的属性。