现在,很多公司都是在用免费的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
5
scriptName = wscript.scriptfullname
6
scriptPath = Left(scriptName, instrRev(scriptName, "\"))
7
8
' create svn object and get the last revision
9
Set svnObj = CreateObject("SubWCRev.object")
10
svnObj.GetWCInfo scriptPath,0,0
11
versionDes = "Revision: " & svnObj.Revision & ". Date:" & svnObj.Date
12
13
' update the version.h with the lastest version
14
Set fs = CreateObject("Scripting.FileSystemObject")
15
scriptPath = Left(scriptPath, Len(scriptPath) -1)
16
slnPath = Left(scriptName, instrRev(scriptPath, "\"))
17
versionFullName = slnPath & "Version.h"
18
19
' check file valid
20
If Not fs.fileexists(versionFullName) Then
21
MsgBox "The file version.h does not exists."
22
wscript.quit
23
End If
24
25
' read content from the file
26
Set fRead = fs.OpenTextFile(versionFullName, 1)
27
fContent = fRead.ReadAll
28
fRead.close
29
30
' modify the revision value
31
Set regEx = New RegExp
32
regEx.Pattern = "#define\s+SHADOW_REVISION\s+""(.*)"""
33
Set Matches = regEx.Execute(fContent)
34
For 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
42
Next
43
fContent = regEx.Replace(fContent, "#define SHADOW_REVISION """ & versionDes & """")
44
45
' Write to version.h
46
Set fWrite = fs.OpenTextFile(versionFullName, 2)
47
fWrite.Write fContent
48
fwrite.close
49
MsgBox "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。