2013-01-09 100 views
5

我需要將我的delphi項目的版本設置爲與另一個項目(不是delphi)相同的構建腳本的一部分。有沒有辦法通過IDE來控制版本號,例如編譯器的命令行參數或類似的東西?由於更改構建時的版本號

+1

這就是爲什麼您應該停止讓IDE控制版本資源並將您自己的版本資源生成腳本編寫爲預生成操作 –

+0

@david您是否有指示如何做到這一點? –

+2

看看類似FinalBuilder的東西,它可以讓你設置所有的EXE等到相同的內部編號,並確保一致的編譯參數等。 – mj2008

回答

12

包括像

{$R 'version.res'} 
在您的項目

線。並用您的版本信息創建一個version.rc文件。你將不得不使用brcc32在老的Delphi版本中自己構建資源。在較新的Delphi版本中,您可以使用

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

讓IDE自動爲您構建它。

最簡單的version.rc看起來是這樣的:

1 VERSIONINFO 
FILEVERSION 9999, 9999, 99, 18048 
PRODUCTVERSION 9999, 9999, 99, 18048 
FILEOS 0x00000004L // comment: VOS_WINDOWS32 
FILETYPE VFT_APP 
{ 
BLOCK "VarFileInfo" 
{ 
    VALUE "Translation", 0x409, 0x4E4 // comment: 0x4E4 = 1252 
} 

BLOCK "StringFileInfo" 
{ 
    BLOCK "040904E4" 
    { 
    VALUE "CompanyName", "Company Name\0" 
    VALUE "FileVersion", "9999.9999.99.18048\0" 
    VALUE "LegalCopyright", "Copyright \0" 
    VALUE "ProductName", "Product Name\0" 
    VALUE "ProductVersion", "9999.9999.99.18048\0" 
    VALUE "Homepage", "http://www.mydomain.com\0" 
    } 
} 
} 

欲瞭解更多信息,請參閱MSDN上​​3210結構。

+0

+1,因爲這是我使用的解決方案,但您確實需要確保刪除version.res,否則對version.rc的更改不會被鏈接器注意到。 –

+0

@BrianFrost:你使用的是什麼版本的Delphi?我從來沒有遇到過這個問題。你確實在項目選項中關閉了「包含版本信息」? –

+0

我的錯誤。我發現當我移動到* .rc中的#include以用於版本編號時,我需要刪除* .res,所以我沒有修改* .rc而是隻包含我的包含文件,它只有實際的版本號。 –

1

Marjan在上面給出了一個很好的答案,但我的回答稍微回答了一些問題。考慮這個RC文件:

VS_VERSION_INFO VERSIONINFO 

#include "..\Ver_Num_Application.txt" 
#define APPLICATION_NAME "My amazing project\0" 
#define VER_NUM_ARTWORKS 4 
#include "..\Libraries\Paslib32\Ver_Num_Library.txt" 
#define COMPANY_NAME  "My company\0" 

FILEVERSION VER_NUM_ARTWORKS, VER_NUM_LIBRARY, VER_NUM_APPLICATION, 1000 
FILEFLAGSMASK 0x3fL 
#ifdef _DEBUG 
FILEFLAGS 0x9L 
#else 
FILEFLAGS 0x8L 
#endif 
FILEOS 0x4L 
FILETYPE 0x1L 
FILESUBTYPE 0x0L 
BEGIN 
    BLOCK "StringFileInfo" 
    BEGIN 
     BLOCK "040904b0" 
     BEGIN 
      VALUE "CompanyName", COMPANY_NAME 
      VALUE "FileDescription", APPLICATION_NAME 
      VALUE "LegalCopyright", "Copyright (C) "COMPANY_NAME 
      VALUE "ProductName", APPLICATION_NAME 
     END 
    END 
    BLOCK "VarFileInfo" 
    BEGIN 
     VALUE "Translation", 0x409, 1200 
    END 
END 

在使用幾個#include語句的好處是,你可以獨自離開RC文件,然後簡單地修改(甚至自動生成)的* .TXT包括像文件:

Ver_Num_Application.txt: 
    #define VER_NUM_APPLICATION 6 

Ver_Num_Library.txt: 
    #define VER_NUM_LIBRARY 156 

注意,現在你必須運行您的構建,以強制鏈接從生成它們之前刪除* .RES文件(可能改變)的版本號。

+0

使用條件定義,在dpr中使用{$ R ...}不同的version.res/rc對會不會更容易? IE'{$ ifdef DEBUG} {$ R version.res debugversion.rc} {$ ELSE} {$ R version.res version.rc} {$ ENDIF}'這不像其他信息會經常改變... –

+0

真正。我想我想爲我的所有項目提供一個'標準'RC文件,並且需要一個擴展名爲* .txt的文件以記事本打開。 –

+1

Aaww come'on Brian,我可以理解一個「標準」文件,但是一個txt文件?我確定你知道如何將.RC文件與記事本關聯爲默認編輯器? ;-) –