Delphi XE3:复杂的预处理问题

我们目前正在从Delphi XE切换到Delphi XE3,并且我们在预构建事件方面遇到严重问题。

我们的预生成事件如下所示:

  SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc
  brcc32 -foProject.res VersionInfo.rc

(请注意,这两个命令分别出现在不同的行上,并在我们的“真实”命令中包含绝对路径),即我们首先从工作副本中提取当前SVN版本,将此信息写入VersionInfo.rc,然后使用Borland资源编译器生成资源文件。

这在以前的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)
  • 构建Project1
  • 文件 - >全部保存,保留建议的名称Unit1.pas / Project1.dpr
  • 项目 - >选项
  • 选择目标“所有配置 - 所有平台”
  • 构建事件 - >预构建事件,输入此内容(两行,抱歉格式化):

    echo one> out.txt

    回声两个>> out.txt

  • 从IDE构建项目

  • 保存并关闭项目
  • RAD Studio命令提示符

  • 导航到项目目录
  • msbuild Project1.dproj =>确定
  • IDE

  • 项目 - >选项
  • 点击进入“搜索路径”
  • 进入一个”
  • 删除“a”
  • 点击确定
  • 项目 - >生成项目
  • 保存并关闭项目
  • RAD Studio命令提示符

  • msbuild Project1.dproj =>错误

  • 我们最终使用了一种类似于David Heffernan提出的解决方法:

  • 将我们所有的调用结合到一个单独的(Ruby)脚本PreBuild.rb中
  • 将此Ruby脚本编译为独立的可执行文件(因为并非所有的开发人员都安装了Ruby)
  • 在Delphi中使用一个预生成事件
  • 如果有人感兴趣,这是我们的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)
    

    我使用的是Delphi XE4,而且我遇到了几乎相同命令的问题。 我们的PreBuildEvent有4行,我尝试了这里描述的内容,将所有内容放在1行上,并用&&分隔我的命令,并且它工作正常。 然后我尝试修改XE4是否会混淆我的预编译,但是在将预编译的代码放回4行后,它仍然可以工作。

    我终于想出了其他能够重现此错误的项目,即通过在每行末尾删除CRLF并将其从XE4环境中重新放回来修改脚本,它修复了PreBuildEvent。

    链接地址: http://www.djcxy.com/p/67671.html

    上一篇: Delphi XE3: Problems with complex pre

    下一篇: What is the best way to install components?