14

svn リビジョン番号を含めるようにビルドを自動化するのに忙しいです。Delphi 2010 を使用しています。svn リビジョン番号 (.svn ディレクトリのエントリ ファイルから読み取ったもの) と指定したバージョン番号を aVersionInfo.rc に挿入するバッチ ファイルを呼び出すビルド前イベントを追加しました。私のプロジェクト。ビルド前のイベントは次のようになります。

call SetVersionInfo.bat 6 5 4

...そしてバッチファイル(誰かがこれが役に立つといいのですが)...

@ECHO OFF
SETLOCAL
setLocal EnableDelayedExpansion

SET _myVar=0
FOR /F %%G in (.svn\entries.) DO (
IF !_myVar! LSS 3 SET /A _myVar+=1 & SET _svn_dir_rev=%%G
)

ECHO 1 VERSIONINFO > aVersionInfo.rc
ECHO. FILEVERSION %1,%2,%3,%_svn_dir_rev%   >> aVersionInfo.rc
ECHO. PRODUCTVERSION 1   >> aVersionInfo.rc
ECHO. FILEOS VOS__WINDOWS32   >> aVersionInfo.rc
ECHO. FILETYPE VFT_APP   >> aVersionInfo.rc
ECHO. BEGIN   >> aVersionInfo.rc
ECHO.   BLOCK "StringFileInfo"   >> aVersionInfo.rc
ECHO.   BEGIN   >> aVersionInfo.rc
ECHO.     BLOCK "080904b0"   >> aVersionInfo.rc
ECHO.     BEGIN   >> aVersionInfo.rc
ECHO.       VALUE "CompanyName","COMPANY\000"   >> aVersionInfo.rc
ECHO.       VALUE "FileDescription","APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "FileVersion","%1.%2.%3.%_svn_dir_rev%\000"   >> aVersionInfo.rc
ECHO.       VALUE "InternalName","APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "LegalCopyright","Copyright APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "LegalTrademarks","APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "OriginalFilename","APP.exe\000"   >> aVersionInfo.rc
ECHO.       VALUE "ProductName","APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "ProductVersion,"1\000"   >> aVersionInfo.rc
ECHO.       VALUE "Comments","Compiled on %date% by %username%\000"   >> aVersionInfo.rc
ECHO.     END   >> aVersionInfo.rc
ECHO.   END   >> aVersionInfo.rc
ECHO.   BLOCK "VarFileInfo"   >> aVersionInfo.rc
ECHO.   BEGIN   >> aVersionInfo.rc
ECHO.     VALUE "Translation", 0x0809 1200   >> aVersionInfo.rc
ECHO.   END   >> aVersionInfo.rc
ECHO. END   >> aVersionInfo.rc
ENDLOCAL

バッチ ファイルはコンパイルの一部として実行され、aVersionInfo.rc が更新され、aVersionInfo.res が再コンパイルされますが、何らかの理由で新しい res ファイルが exe のコンパイルに使用されません。ただし、クリーン ビルド時または 2 回目のコンパイル時に更新されます。「プレ」ビルドイベントが呼び出される前に、rcファイルへの変更のチェックが行われるようです。これにより、実際にはビルド中のイベントになります。または、何か不足していますか?

別のビルド前イベントとして aVersionInfo.res ファイルを削除しようとしましたが、コンパイラはこのファイルが見つからないと不平を言います。それは

{$R 'aVersionInfo.res' 'aVersionInfo.rc'}

ラインが間違った場所にありますか?

4

5 に答える 5

10

使ってみて

{$R aVersionInfo.res}

バッチ ファイルから手動で呼び出しbrcc32 aVersionInfo.rcます (.rc ファイルの作成が完了した後)。そうすれば、.res ファイルを通常の IDE ビルドから除外する必要があります。

于 2010-01-18T18:11:29.697 に答える
1

["]
ECHO. VALUE "ProductName","APP\000" >> aVersionInfo.rc
ECHO. VALUE "ProductVersion,"1\000" >> aVersionInfo.rc
------- HERE - ----------------------^
エコー。VALUE "Comments","Compiled on %date% by %username%\000" >> aVersionInfo.rc さようなら

于 2010-01-18T17:17:13.580 に答える
1

TL;DR:

Programステートメント{$R 'aVersionInfo.res' 'aVersionInfo.rc'}の直下に1行置いからビルドします。または、BRCC32 を使用して、.RES ファイルの初回ビルドを強制します。

長いバージョン:

次の行を推測します。

{$R 'aVersionInfo.res' 'aVersionInfo.rc'}

は間違った場所にありますが、部分的に正しいです。

Delphi XE2 で .RC ファイルを使用して最初にセットアップしたとき、わずかに異なるコードで同じ問題が発生し、コンパイルできる場合とそうでない場合がありました。次のようなバリエーションを試しました:

{$R 'aVersionInfo.res' 'aVersionInfo.rc'}
{$R '.\aVersionInfo.res' '.\aVersionInfo.rc'}

しかし、XE2 コンパイラーは、RES ファイルが見つからないという不平を言い続けました (実際に存在しない場合) (これは私の最初のビルドであることに注意してください)。

最初に、その行をProgramステートメントのすぐ下に配置する必要があることがわかりました。

program TTClient;
{$R 'VersionInfo.res' 'VersionInfo.rc'}

...そして、すでに存在するあなたの近くではありません

{$R *.res}

次に、プログラムを 1 回ビルドします

その後、行をより論理的な場所に戻すことができます。

{$R *.res}
{$R 'VersionInfo.res' 'VersionInfo.rc'}

奇妙な理由により、Delphi が .rc ファイルがプロジェクトの一部であることを「認識する」と、次のいずれかの場合は問題になりません。

  • ラインを別の場所に配置する
  • .res ファイルが存在するかどうか

プリコンパイル手順は必要ありません。.RC ​​ファイルが変更された場合、以前のバージョンが存在するかどうかに関係なく、コンパイラは .RES ファイルを再構築します。

この奇妙な動作は、このシステムを最初にセットアップするときにはあまり役に立ちません;-(

プロジェクト ソースの解析と .dproj ファイルの構築に関して、他にも奇妙なことが起こっており、このソリューションにたどり着きました。

.rc ファイルの名前を変更すると、再び問題が発生する可能性があります。古い .rc ファイルを指している .dproj ファイルの残りがあり、コンパイラはそれが見つからないと文句を言います。これを修正するには、.dproj ファイルからこの古い名前を編集する必要があります。

これはすべて XE2 で、他のバージョンYMMVであったことに注意してください。


追加するために編集: XE2 バージョン情報が機能しない問題と戦わなければならない場合があります。

于 2015-09-03T12:27:50.080 に答える
0

リソースを含む Delphi ソース ファイルを変更する行をバッチ ファイルに追加します。

touch VersionInfo.pas

次に、ソース ファイルを再コンパイルする必要があります。ソース ファイルが変更されていない場合、コンパイラがプログラムのその部分を再リンクする理由がないため、更新されたリソース ファイルは認識されません。

于 2010-01-18T18:38:28.323 に答える
0

バッチ ファイル内で brcc32 を呼び出すと、常に .res ファイルが更新されます。私は似たようなことをしますが、コンパイルだけでなくビルドでも機能します。

于 2010-01-18T19:16:35.830 に答える