2013-02-14 70 views
16

目前我們正處在切換德爾福XE德爾福XE3過程中,我們有嚴重的問題,與我們前期構建的事件的問題。德爾福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 

即我們使用兩個&字符如果第一個成功執行所述第二命令。

這工作,但直到我們再次編輯項目選項 - 德爾福XE3總是打亂了:-(

的預生成事件是否有人知道一個解決方案/解決方法我想我們可以寫一個? 。簡單的命令行工具,調用SubWCRev和brcc32,但我更喜歡一個簡單的解決方案

UPDATE:步驟輕鬆地重現此錯誤

IDE

  • 文件 - >新建 - > VCL窗體應用程序(德爾福)
  • 構建PROJECT1
  • 文件 - >保存,一直建議名稱Unit1.pas/Project1.dpr
  • 項目 - >選項
  • 選擇目標「所有配置 - 所有平臺」
  • 生成事件 - >預生成事件,進入這個(兩條線,用於格式化抱歉):

    呼應一個> out.txt

    回聲2 >>出來。TXT

  • 從IDE構建項目

  • 保存&關閉該項目

RAD Studio命令提示符

  • 導航到項目目錄
  • 的MSBuild PROJECT1。 dproj =>好吧

IDE

  • 項目 - >選項
    • 點擊進入 「搜索路徑」
      • 輸入 「A」
      • 刪除 「一」
    • 點擊好吧
  • 項目 - >生成項目
  • 保存&關閉該項目

RAD Studio命令提示符

  • 的MSBuild Project1.dproj =>錯誤
+10

我遇到過這個問題。我放棄了試圖尋找解決方案。我的預生成操作現在全部讀取'調用PreBuild.bat' – 2013-02-14 13:08:29

+0

您是否發佈過質量中心錯誤報告?沒有什麼可以找到包含'build'的XE3錯誤 – 2013-02-14 19:00:37

+0

@JanDoggen不,現在還沒有,因爲我們昨天開始注意到這個。我會盡量在明天發佈。 – 2013-02-14 19:04:53

回答

2

我們結束使用類似於David Hef提出的解決方法費爾南:

  • 我們所有的呼叫組合成一個單一的(紅寶石)腳本PreBuild.rb
  • 編譯這個Ruby腳本到一個獨立的可執行文件(因爲不是所有的開發商都安裝了Ruby)
  • 使用一個單一的預在德爾福

如果任何人的興趣建立時,這裏是我們的預生成事件:

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) 
2

我用Delphi XE4,我幾乎相同的命令有同樣的問題。我們的PreBuildEvent有4行,我嘗試了這裏描述的內容,把所有內容放在1行上,並將我的命令與& &分開,並且工作正常。然後我嘗試修改XE4是否會混淆我的預編譯,但是在將預編譯的代碼放回4行後,它仍然可以工作。

我終於想通了其他能夠重現此錯誤的項目,即通過在每行末尾刪除CRLF並將其從XE4環境中重新放回來修改腳本,它修復了PreBuildEvent。

+0

那裏有一分鐘,我以爲你發佈了一個「我也是」的答案 - 我們得到了很多。看起來你確實在那裏有答案,所以這很好。 – user1618143 2013-12-06 20:10:49