天天看點

Visual studio每次build自動增加版本号

關鍵詞:visual studio,rc file,VS_VERSION_INFO,FILEVERSION,PRODUCTVERSION

目标:希望每次在vs中編譯項目時,生成的可執行程式版本号自動+1

環境:vs2010,python 2.7.8

步驟:

1.在rc檔案同目錄下添加version.h頭檔案,内容如下:

#define RELEASE_VER 1  // 0: beta version; 1: release version
#define RELEASE_DATE "Sep 01 2014" // Mmm dd yyyy; only used for RELEASE_VER=1

#define RELEASE_VER_MAIN  1 // version number (binary)
#define RELEASE_VER_MAIN2 0
#define RELEASE_VER_SUB   0
#define RELEASE_VER_SUB2  0 

// version number (string)
#define TOSTRING2(arg) #arg
#define TOSTRING(arg) TOSTRING2(arg)
#define RELEASE_VER_STR     TOSTRING(RELEASE_VER_MAIN) "." TOSTRING(RELEASE_VER_MAIN2) "." TOSTRING(RELEASE_VER_SUB) "." TOSTRING(RELEASE_VER_SUB2)      

2.用文本編輯器(notepad++)打開rc檔案,修改檔案内容

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////
#undef APSTUDIO_READONLY_SYMBOLS

/////
// Chinese (Simplified, PRC) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

#ifdef APSTUDIO_INVOKED
/////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,0,0,1
 PRODUCTVERSION 1,0,0,1
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x40004L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "080404b0"
        BEGIN
            VALUE "CompanyName", "TODO: <Company name>"
            VALUE "FileDescription", "TODO: <File description>"
            VALUE "FileVersion", "1.0.0.1"
            VALUE "InternalName", "VersionT.exe"
            VALUE "LegalCopyright", "Copyright (C) 2014"
            VALUE "OriginalFilename", "VersionT.exe"
            VALUE "ProductName", "VersionTest"
            VALUE "ProductVersion", "1.0.0.1"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x804, 1200
    END
END

#endif    // Chinese (Simplified, PRC) resources
/////



#ifndef APSTUDIO_INVOKED
/////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////
#endif    // not APSTUDIO_INVOKED      

修改前的rc檔案内容

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#include "version.h"

#define APSTUDIO_READONLY_SYMBOLS
/////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////
#undef APSTUDIO_READONLY_SYMBOLS

/////
// Chinese (Simplified, PRC) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

#ifdef APSTUDIO_INVOKED
/////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION RELEASE_VER_MAIN,RELEASE_VER_MAIN2,RELEASE_VER_SUB,RELEASE_VER_SUB2
 PRODUCTVERSION RELEASE_VER_MAIN,RELEASE_VER_MAIN2,RELEASE_VER_SUB,RELEASE_VER_SUB2
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x40004L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "080404b0"
        BEGIN
            VALUE "CompanyName", "TODO: <Company name>"
            VALUE "FileDescription", "TODO: <File description>"
            VALUE "FileVersion", RELEASE_VER_STR
            VALUE "InternalName", "VersionT.exe"
            VALUE "LegalCopyright", "Copyright (C) 2014"
            VALUE "OriginalFilename", "VersionT.exe"
            VALUE "ProductName", "VersionTest"
            VALUE "ProductVersion", RELEASE_VER_STR
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x804, 1200
    END
END

#endif    // Chinese (Simplified, PRC) resources
/////



#ifndef APSTUDIO_INVOKED
/////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////
#endif    // not APSTUDIO_INVOKED      

修改後的rc檔案内容

3.把addVersionNum.py檔案放到version.h同目錄下(不一定要同目錄,也可以用相對路徑)

在項目property->Build Events->Pre-Build Event的CommandLine中添加如下語句:

python.exe $(ProjectDir)addVersionNum.py      

python腳本内容如下(PS:很低級的python寫法,但是能work 說不定熟悉python正則的高手一行代碼就能搞定)

#author: jakubfong
#version: 1.0 2014-10-27

import sys
import string
import re

f = open(r'version.h', 'r+')
lines = f.readlines()
data = []
for line in lines:
        tmp = re.split('\s+', line)
        if len(tmp) > 2 and tmp[1] == 'RELEASE_VER_SUB2':
            tmp[2] = str(int(tmp[2])+1);
            strtmp = ' '.join(tmp)
            strtmp += '\n'
            data.append(strtmp)
            print "###"+strtmp
        else:
            data.append(line)
f.seek(0)
f.writelines(data)
f.close()      

work done

參考連結:http://stackoverflow.com/questions/16626329/how-can-i-modify-vs-version-info-from-the-cpp-file?newreg=fee2fc67f78c4cd6a8b0e66688691b58

轉載于:https://www.cnblogs.com/bugchecker/p/auto-add-version-num-on-each-build-under-visual-studio.html