16

現在、Delphi XE から Delphi XE3 への切り替えを進めており、ビルド前のイベントで深刻な問題が発生しています。

ビルド前のイベントは次のようになります。

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

(これら 2 つのコマンドは別々の行に表示され、「実際の」コマンドには絶対パスが含まれていることに注意してください)。つまり、まず作業コピーから現在の SVN バージョンを抽出し、この情報を VersionInfo.rc に書き込み、次に Borland リソース コンパイラを使用します。リソースファイルを生成します。

これは以前の Delphi バージョンでは完全に機能していましたが、XE3 でプロジェクト オプションを開くたびに、XE3 はこれを次のように変換します。

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

(これは 1 行であり、両方のコマンドが 1 つのアンパサンドで区切られていることに注意してください)。これにより、ビルドが失敗します。

現在の回避策は、これを手動で次のように変更することです。

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

つまり、2 つのアンパサンドを使用して、最初のコマンドが成功した場合に 2 番目のコマンドを実行します。

これは機能しますが、プロジェクト オプションを再度編集するまでのみです。Delphi XE3 は常にビルド前イベントを台無しにします :-(

これに対する解決策/回避策を知っている人はいますか? SubWCRev と brcc32 を呼び出す単純なコマンド ライン ツールを作成できると思いますが、より単純なソリューションを希望します。

更新: このバグを簡単に再現する手順

IDE

  • ファイル -> 新規 -> VCL フォーム アプリケーション (Delphi)
  • ビルド プロジェクト 1
  • ファイル -> すべて保存、提案された名前を保持 Unit1.pas / Project1.dpr
  • プロジェクト -> オプション
  • ターゲット「すべての構成 - すべてのプラットフォーム」を選択
  • ビルド イベント -> ビルド前のイベント、次のように入力します (2 行、書式設定のため申し訳ありません)。

    エコー 1 > out.txt

    エコー 2 >> out.txt

  • IDE からプロジェクトをビルドする

  • プロジェクトを保存して閉じる

RAD Studio コマンド プロンプト

  • プロジェクト ディレクトリに移動します。
  • msbuild Project1.dproj => OK

IDE

  • プロジェクト -> オプション
    • 「検索パス」をクリックします
      • 入力します"
      • 「あ」を削除
    • OKをクリック
  • プロジェクト -> プロジェクトのビルド
  • プロジェクトを保存して閉じる

RAD Studio コマンド プロンプト

  • msbuild Project1.dproj => エラー
4

3 に答える 3

2

最終的に、DavidHeffernanによって提案されたものと同様の回避策を使用しました。

  • すべての呼び出しを1つの(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)
于 2013-03-18T12:08:52.707 に答える
2

私は Delphi XE4 を使用していますが、ほぼ同じコマンドで同じ問題が発生しました。私たちの PreBuildEvent には 4 行あります。ここで説明されていることを試し、すべてを 1 行にまとめ、コマンドを && で区切りました。次に、XE4 がプレビルドを台無しにするかどうかを確認するために変更を試みましたが、プレビルドを 4 行に戻した後も、まだ機能していました。

最終的に、このエラーを再現できる他のプロジェクトで、各行の末尾にある CRLF を削除してスクリプトを編集し、XE4 環境から元に戻すだけで、PreBuildEvent が修正されたことがわかりました。

于 2013-12-06T19:41:19.900 に答える