2010-01-18 93 views
12

我忙於自動構建包含svn修訂版編號。我們使用的是Delphi 2010.我添加了一個預生成事件,調用一個批處理文件,將svn修訂版號(從.svn目錄中的條目文件中讀取)和指定的版本號注入到aVersionInfo.rc中,我的項目。預生成事件看起來是這樣的:Delphi預編譯事件不會在執行之前編譯

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。然而,它是在一個乾淨的構建過程中更新的,或者是我第二次編譯的。似乎在調用「pre」生成事件之前檢查對rc文件的更改。這實際上使它成爲中期製作活動。或者我錯過了什麼?

我曾嘗試刪除aVersionInfo.res文件作爲另一個預生成事件,但編譯器抱怨此文件丟失。難道是

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

行是在錯誤的地方?

回答

9

嘗試(您先請」重新創建.rc文件)。這樣,您的.res文件應該從常規IDE版本中排除。

+0

感謝,作品像一個魅力 – 2010-01-19 07:46:27

1

可能缺少[ 「]
ECHO。VALUE 」產品名稱「,」 APP \ 000" >> aVersionInfo.rc
ECHO。VALUE 「的ProductVersion,」 1 \ 000" >> aVersionInfo.rc
------- HERE -----------------------^
ECHO。使用

{$R aVersionInfo.res} 

和手動從您的批處理文件調用brcc32 aVersionInfo.rc VALUE 「註釋」,>> aVersionInfo.rc 再見 「由%USERNAME%\ 000編譯於%DATE%」

+0

對不起,我的錯誤:「包含在原文中,當我刪除公司的具體信息時,它就丟失了,雖然發現它不錯! – 2010-01-19 07:23:41

0

添加一行到修改,其中包括該資源的Delphi源文件的批處理文件:

touch VersionInfo.pas 

然後,將源文件應該得到重新編譯。如果源文件未被修改,那麼編譯器沒有理由重新鏈接該程序的那一部分,因此更新的資源文件將不會被注意到。

+0

該資源包含在我的.dpr file。如果我觸摸dpr文件,它只會在編譯完成後彈出更改並彈出兩條消息,詢問是否要重新加載.dproj文件和.rc文件。舊res文件中的版本信息仍然使用。 – 2010-01-19 07:45:54

0

您可以在批處理文件中調用brcc32,以便它將始終更新.res文件。我做了類似的事情,它可以在編譯和構建中使用。

0

TL; DR:

廣場正下方,計劃語句行{$R 'aVersionInfo.res' 'aVersionInfo.rc'}一次,然後建立。或者使用BRCC32強制第一次構建。RES文件

龍版本:

你的猜測,該行:

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

是在錯誤的地方是部分正確。

當我最初在Delphi XE2下使用.RC文件進行設置時,對於稍微不同的代碼,有時編譯有時會遇到相同的麻煩,有時候不會。我試着像變化:

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

但XE2編譯器不停地抱怨RES文件不被發現,如果確實是不存在(注意,這是我最初的版本)。

事實證明,你首先必須把該行正下方的計劃聲明:

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

...而不是在你的附近已經存在

{$R *.res} 

然後你建立你的程序一次

那之後,你可以招行回到一個更合乎邏輯的地方:

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

出於某種奇怪的原因,一旦德爾福「知道」的rc文件是項目的一部分,它不再是問題如果您:

  • 地方行其他地方
  • 有res文件存在與否

不需要預編譯步驟。如果.RC文件被修改,編譯器將重建.RES文件,無論早期版本是否存在。

這種怪異的行爲,當你開始 ;-(建立這個系統並不能真正幫助

還有其他一些奇怪的事情與項目源的解析和.dproj文件的建設正在進行哪些帶我到這個解決方案,特別是:

如果您重命名.rc文件,這可能會讓您再次陷入困境:.dproj文件中仍存在指向舊的.rc文件的殘留,編譯器會抱怨關於找不到它,你必須從.dproj文件中編輯這個舊名來解決這個問題。

注意這是全部在XE2下,其他版本YMMV


編輯補充:您可能還需要與XE2 Version Info Not Working爭執。