现在,很多公司都是在用免费的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。