[BuildRelease]python修改源代码中的版本信息

 

一 源代码中的版本信息

1).net

在.net的程序中通常有assemblyinfo(.cs / .vb / .cpp)文件来包含dll/exe的版本信息。如下某assemblyinfo.cs中包含如下:

[assembly: AssemblyVersion("5.00.100.00")]
[assembly: AssemblyFileVersion("5.00.100.00")]

 

更通常的做法是,一个product拥有相同的版本号信息,所以产品下所有的projects公用一个assemblyinfo文件,这个公用的文件一般被更名为globalassemblyinfo(.cs / .vb / .cpp )。

 

2)C++

对于C++的projects,版本信息被存储在.RC文件中。但是更通用的做法是所有的C++ projects 的.RC 引用一个globalversioninfo.h(或globalproductversion.h).

其中globalversioninfo.h中包含了版本信息字符串常量的定义,如下:

globalversioninfo.h

#define FILEVER        1,0,0,1
#define PRODUCTVER     1,0,0,1
#define STRFILEVER     "1, 0, 0, 1\0"
#define STRPRODUCTVER  "1, 0, 0, 1\0"

 

手动修改所有的projects中的.RC文件如下:

* .rc

/////////////////////////////////////////////////////////////////////////////
//
// Version
//
# include "globalversioninfo.h"
VS_VERSION_INFO VERSIONINFO
 FILEVERSION FILEVER
 PRODUCTVERSION PRODUCTVER
 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", STRFILEVER
            VALUE "InternalName", "TestCpp.exe"
            VALUE "LegalCopyright", "Copyright (C) 2011"
            VALUE "OriginalFilename", "TestCpp.exe"
            VALUE "ProductName", "TODO: <Product name>"
            VALUE "ProductVersion", STRPRODUCTVER
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x804, 1200
    END
END

参考:http://support.microsoft.com/kb/237870/

 

二 python来修改assemblyinfo和versioninfo中的版本号

在自动化的build流程中,在downlaod代码后build前需要修改版本信息。

 

代码如下:


import os
import os.path
import sys
import re

def UpdateVersionForFile(file, regrexorplaceholder, version):
  f 
= open(file,"r")
  filestr 
= f.read()
  f.close()
  
  newfilestr 
= re.sub(regrexorplaceholder,version, filestr)
  
  
if not os.access(file,os.W_OK):
    os.chmod(path,stat.S_IWRITE)
  
  newf 
= open(file,"w")
  newf.write(newfilestr)
  newf.close()
  
def UpdateVersion(dirorfile, regrexorplaceholder, version):
  
if os.path.isfile(dirorfile) and os.path.exists(dirorfile):
     UpdateVersionForFile(dirorfile, regrexorplaceholder, version)
  
else:
    
print ("update failed")

def usage():
  helpstr 
= " \n \
  Usage: \n \
     The first parameter need be the file, \n \
     The second parameter need be regrex 
or placeholder for version, \n \
     The third parameter need be version. \n \
  Examples: \n \
     updateversion.py globalAssemblyInfo.cs  (\d
+\.\d+\.\d+\.\d+)  10.2.0.123456 \n \
     updateversion.py globalAssemblyInfo.cpp  (\d
+\.\d+\.\d+\.\d+)  10.2.0.123456 \n \
     updateversion.py globalversioninfo.h (\d+\.\d+\.\d+\.\d+)  10.2.0.123456 "
  print (helpstr)

if __name__ == "__main__":
  
ifnot len(sys.argv) == 4):
    
print(" The parameters are not correct!")
    usage()
    exit(0)
  UpdateVersion(sys.argv[
1], sys.argv[2], sys.argv[3])
  exit(
1)
  
  

 

 

完!

posted @ 2011-01-30 18:16  iTech  阅读(1534)  评论(0)    收藏  举报