随笔 - 64, 文章 - 11, 评论 - 12, 引用 - 0
数据加载中……

管理项目的版本号

      现在,很多公司都是在用免费的SVN工具来管理版本。如何让可执行程序与DLL的信息与生成时的SVN版本相对应呢?以便于更好地跟踪项目呢?在原来我是用一段脚本来实现的。
分为Version.h, Version.rc,和一段脚本。
//Version.h
#define SHADOW_MAJOR_VERSION 4
#define SHADOW_MINOR_VERSION 5
#define SHADOW_BETA_MAJOR_VERSION 7
#define SHADOW_BETA_MINOR_VERSION 155
#define SHADOW_VERSION "4.5.7.155"
#define SHADOW_REVISION "0"

在version.rc中,包含Version.h并把相应的版本信息用上面的SHADOW_REVISION及 SHADOW_VERSION赋值

 1' Set the revision for the application
 2' 
 3
 4' Get File path
 5scriptName = wscript.scriptfullname
 6scriptPath = Left(scriptName, instrRev(scriptName, "\"))
 7
 8' create svn object and get the last revision
 9Set svnObj = CreateObject("SubWCRev.object")
10svnObj.GetWCInfo scriptPath,0,0
11versionDes = "Revision: " & svnObj.Revision & ". Date:" & svnObj.Date
12
13' update the version.h with the lastest version
14Set fs = CreateObject("Scripting.FileSystemObject")
15scriptPath = Left(scriptPath, Len(scriptPath) -1)
16slnPath = Left(scriptName, instrRev(scriptPath, "\"))
17versionFullName = slnPath & "Version.h"
18
19' check file valid
20If Not fs.fileexists(versionFullName) Then
21    MsgBox "The file version.h does not exists."
22    wscript.quit
23End If
24
25' read content from the file
26Set fRead = fs.OpenTextFile(versionFullName, 1)
27fContent = fRead.ReadAll
28fRead.close
29
30' modify the revision value
31Set regEx = New RegExp
32regEx.Pattern = "#define\s+SHADOW_REVISION\s+""(.*)"""
33Set Matches = regEx.Execute(fContent)
34For Each Match in Matches  
35      RetStr = RetStr & "Match found at position "
36      RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
37      RetStr = RetStr & Match.Value & "'." & vbCRLF
38      If Match.submatches(0= versionDes Then
39          MsgBox "The revision is already lastest"
40          wscript.quit
41      End If
42Next
43fContent = regEx.Replace(fContent, "#define SHADOW_REVISION """ & versionDes & """")
44
45' Write to version.h
46Set fWrite = fs.OpenTextFile(versionFullName, 2)
47fWrite.Write fContent
48fwrite.close
49MsgBox "Update the revision successful"

可以看出实现起来比较麻烦。
这里介绍一种新的方法。新添一个模板文件,格式如下。
 1/*
 2    Substitution keyword file for SubWCRev (part of Tortoise SVN), to autochange version number with SVN Rev number
 3*/

 4
 5#pragma once
 6
 7
 8#define  _ProductVersion "3.0.0.1"
 9#define  _FileVersion "3.2.0.$WCREV$";
10#define  _Revision  "$WCREV$";
11#define  _Modified  "$WCMODS?Modified:Not modified$";
12#define  _Date      "$WCDATE$";
13#define  _Range     "$WCRANGE$";
14#define  _Mixed     "$WCMIXED?Mixed revision WC:Not mixed$";
15#define  _URL       "$WCURL$";
16#define  _ProductName  "Software 1.0"
17#define  _CompanyName   "Company"
18#define  _FileDescription "SoftWare module"
19#define  _LegalCopyright "Company, All rights reserved."
20#define  _FileVersion_0  3
21#define  _FileVersion_1  2
22#define  _FileVersion_2  0
23#define  _FileVersion_3  $WCREV$
24#define  _ProductVersion_0  3
25#define  _ProductVersion_1  2
26#define  _ProductVersion_2  0
27#define  _ProductVersion_3  1

在打包时运行如下的批处理文件就会自动生成或者更新version.h
SubWCRev.exe ..\ SubWCRev.txt ..\version.h

pause

资源文件还是引用version.h定义好的常量。这种方式就很简单,而且不易出错。上面介绍C++方面的版本跟踪,在C#中则是先制定AssemblyInfo.cs的一个模板,在打包时用上面的命令去更新AssemblyInfo.cs。

posted on 2009-04-24 10:45 Robertxiao 阅读(798) 评论(0)  编辑 收藏 引用 所属分类: 天马行空


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理