Delphi XE3:复杂的预构建事件的问题
我们目前正在从Delphi XE切换到Delphi XE3,而且我们在构建前事件中遇到了严重的问题。
我们的预构建事件如下所示: SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc brcc32 -foProject.res VersionInfo.rc (请注意,这两个命令显示在单独的行上;并且包含我们的“实际”命令中的绝对路径) 这在以前的Delphi版本中运行良好,但是每当我们在XE3中打开项目选项时,XE3会将其转换为: SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc &brcc32 -foProject.res VersionInfo.rc (请注意,这是一行,两个命令由一个&符分隔)。 我们目前的解决方法是手动将其更改为 SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc && brcc32 -foProject.res VersionInfo.rc 即如果第一个命令成功,我们使用两个和号执行第二个命令。 这是有效的,但只有在我们再次编辑项目选项之前,Delphi XE3总是会混淆预构建事件:-( 有人知道解决方案/解决方法吗?我想我们可以编写一个简单的命令行工具,调用SubWCRev和brcc32,但我更喜欢一个更简单的解决方案。 更新:轻松重现此错误的步骤 IDE >文件 – >新 – > VCL表单应用程序(Delphi) 回应一个> out.txt 回声二>> out.txt RAD Studio命令提示符 >导航到项目目录 IDE >项目 – >选项 >点击进入“搜索路径” >输入“a” >点击确定 >项目 – >建设项目 RAD Studio命令提示符 > msbuild Project1.dproj =>错误 解决方法
我们最终使用类似于David Heffernan提出的解决方法:
>将我们的所有调用组合成一个单独的(Ruby)脚本PreBuild.rb 如果有人感兴趣,这里是我们的PreBuild事件: PreBuild "<path_to_SVN_working_copy>" "VersionInfo.rc.in" $(OUTPUTNAME).res 这里是脚本PreBuild.rb: #!/usr/bin/env ruby require 'tempfile' if ARGV.length < 3 puts "usage: #{$0} <path> <infile> <outfile>" exit 1 end # svnversion.exe is part of the SVN command line client svnversion = "svnversion.exe" path,infile,outfile = ARGV[0],ARGV[1],ARGV[2] # call svnversion executable,storing its output in rev rev_str = `#{svnversion} "#{path}"`.chop # extract the first number (get rid of M flag for modified source) rev = /^[0-9]+/.match(rev_str)[0] # get current date date = Time.new # remove old output file (ignore errors,e.g. if file didn't exist) begin File.delete(outfile) rescue end input = File.new(infile,"r") tmpname = "VersionInfo.rc" tmp = File.new(tmpname,"w+") input.each do |line| # replace $WCREV$ with revision from svnversion call outline = line.gsub(/$WCREV$/,rev) # replace $WCDATE$ with current date + time outline = outline.gsub(/$WCDATE$/,date.to_s) # write modified line to output file tmp.puts(outline) end input.close tmp.close puts "SubWCRev: Revision: #{rev},date: #{date},written to #{tmpname}" call = "brcc32 -fo#{outfile} #{tmpname}" puts call system(call) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |