加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi XE3:复杂的预构建事件的问题

发布时间:2020-12-15 10:14:06 所属栏目:大数据 来源:网络整理
导读:我们目前正在从Delphi XE切换到Delphi XE3,而且我们在构建前事件中遇到了严重的问题。 我们的预构建事件如下所示: SubWCRev "SVN-Path" "InputFile" VersionInfo.rc brcc32 -foProject.res VersionInfo.rc (请注意,这两个命令显示在单独的行上;并且包含我
我们目前正在从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)
>构建项目1
>文件 – >保存所有,保留建议名称Unit1.pas / Project1.dpr
>项目 – >选项
>选择目标“所有配置 – 所有平台”
>构建事件 – >预构建事件,请输入(两行,格式化对不起):

回应一个> out.txt

回声二>> out.txt
>从IDE构建项目
>保存&关闭项目

RAD Studio命令提示符

>导航到项目目录
> msbuild Project1.dproj =>好

IDE

>项目 – >选项

>点击进入“搜索路径”

>输入“a”
>删除“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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读