在VS.NET中新建一个动态库工程,编译即可。
利用此Task,可以在自动Build中实现每日构建时自动增加版本号
以及获取现在的版本号(以便出每日构建结果报告)。
适用于VC的资源文件(.rc).
using NAnt.Core;
using NAnt.Core.Attributes;
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace NAnt.ResourceFileVersionTask {
public class ResourceFileManipulator
{
/* field can be FILEVERSION or PRODUCTVERSION /
private static string ExtraceHeaderVersion(string source,string field)
{
Regex regex = new Regex(@"^\s" + field + @"\s*(?
1<wholeversion>(?<major>[0123456789]*)\s*,\s*(?<minor>[0123456789]*)\s*,\s*(?<revision>[0123456789]*)\s*,\s*(?<build>[0123456789]*))\s*(\n|$)",RegexOptions.Multiline);
2
3Match m = regex.Match(source);
4
5string strMajor = m.Groups["Major"].Value;
6string strMinor = m.Groups["Minor"].Value;
7string strRevision = m.Groups["Revision"].Value;
8string strBuild = m.Groups["Build"].Value;
9
10string strVersion = strMajor + "." + strMinor + "." + strRevision + "." + strBuild;
11
12return strVersion;
13}
14
15public static string ExtractHeaderFileVersion(string source)
16{
17return ExtraceHeaderVersion(source,"FILEVERSION");
18}
19
20public static string ExtraceHeaderProductVersion(string source)
21{
22return ExtraceHeaderVersion(source,"PRODUCTVERSION");
23}
24
25/* field can be FILEVERSION or PRODUCTVERSION */
26private static string IncrementHeaderVersion(string source,string field)
27{
28Regex regex = new Regex(@"^\s*" + field + @"\s*(?<wholeversion>(?<major>[0123456789]*)\s*,\s*(?<minor>[0123456789]*)\s*,\s*(?<revision>[0123456789]*)\s*,\s*(?<build>[0123456789]*))\s*(\n|$)",RegexOptions.Multiline);
29
30Match m = regex.Match(source);
31
32string strMajor = m.Groups["Major"].Value;
33string strMinor = m.Groups["Minor"].Value;
34string strRevision = m.Groups["Revision"].Value;
35string strBuild = m.Groups["Build"].Value;
36
37string strNewVersion = strMajor + "," + strMinor + "," + strRevision + "," + (Int32.Parse(strBuild)+1).ToString();
38
39string strNewFile = source.Substring(0,m.Groups["WholeVersion"].Index);
40strNewFile += strNewVersion;
41strNewFile += source.Substring(m.Groups["WholeVersion"].Index + m.Groups["WholeVersion"].Length);
42
43return strNewFile;
44}
45
46public static string IncrementHeaderFileVersion(string source)
47{
48return IncrementHeaderVersion(source,"FILEVERSION");
49}
50
51public static string IncrementHeaderProductVersion(string source)
52{
53return IncrementHeaderVersion(source,"PRODUCTVERSION");
54}
55
56/* field can be FileVersion or ProductVersion */
57private static string UpdateBlockVersions(string source,string field,string strVersion)
58{
59Regex regex = new Regex(@"^\s*VALUE\s*""" + field + @"""\s*,\s*""(?<wholeversion>[0123456789\s,\\.]*)""\s*(\n|$)",RegexOptions.Multiline);
60
61Match m = regex.Match(source);
62
63if (m.Groups.Count == 0)
64return source;
65if (m.Groups["WholeVersion"] == null)
66return source;
67if (m.Groups["WholeVersion"].Value == "")
68return source;
69
70string strNewFile = source.Substring(0,m.Groups["WholeVersion"].Index);
71strNewFile += strVersion;
72strNewFile += UpdateBlockVersions(source.Substring(m.Groups["WholeVersion"].Index + m.Groups["WholeVersion"].Length),field,strVersion);
73
74return strNewFile;
75}
76
77public static string UpdateBlockFileVersions(string source,string strVersion)
78{
79return UpdateBlockVersions(source,"FileVersion",strVersion);
80}
81
82public static string UpdateBlockProductVersions(string source,string strVersion)
83{
84return UpdateBlockVersions(source,"ProductVersion",strVersion);
85}
86
87// versino must be "a.b.c.d"
88public static string IncrementVersion(string strVersion)
89{
90Regex regex = new Regex(@"(?<major>[0123456789]*)\\.(?<minor>[0123456789]*)\\.(?<revision>[0123456789]*)\\.(?<build>[0123456789]*)",RegexOptions.Multiline);
91
92Match m = regex.Match(strVersion);
93
94string strMajor = m.Groups["Major"].Value;
95string strMinor = m.Groups["Minor"].Value;
96string strRevision = m.Groups["Revision"].Value;
97string strBuild = m.Groups["Build"].Value;
98
99string strNewVersion = strMajor + "." + strMinor + "." + strRevision + "." + (Int32.Parse(strBuild)+1).ToString();
100
101return strNewVersion;
102}
103}
104
105[TaskName("IncrementVersion")]
106public class IncrementVersionTask : Task {
107
108string _ResourceFile = null;
109
110[TaskAttribute("ResourceFile", Required=true)]
111public string ResourceFile {
112get { return _ResourceFile; }
113set { _ResourceFile = value; }
114}
115
116protected override void ExecuteTask()
117{
118try
119{
120TextReader reader = new StreamReader(_ResourceFile,Encoding.GetEncoding("GB2312"));
121string strFile = reader.ReadToEnd();
122reader.Close();
123
124string strOldVersion = ResourceFileManipulator.ExtractHeaderFileVersion(strFile);
125string strNewVersion = ResourceFileManipulator.IncrementVersion(strOldVersion);
126
127strFile = ResourceFileManipulator.IncrementHeaderFileVersion(strFile);
128strFile = ResourceFileManipulator.IncrementHeaderProductVersion(strFile);
129
130strFile = ResourceFileManipulator.UpdateBlockFileVersions(strFile,strNewVersion);
131strFile = ResourceFileManipulator.UpdateBlockProductVersions(strFile,strNewVersion);
132
133string strActualNewVersion = ResourceFileManipulator.ExtractHeaderFileVersion(strFile);
134
135TextWriter writer = new StreamWriter(_ResourceFile,false,Encoding.GetEncoding("GB2312"));
136writer.Write(strFile);
137writer.Close();
138
139//Log(Level.Info, LogPrefix + "ResourceFile = [" + _ResourceFile + "] OldVersion = [" + strOldVersion + "] ---> NewVersoin = [" + strActualNewVersion + "]");
140}
141catch(System.Exception e)
142{
143throw new NAnt.Core.BuildException(e.Message,e);
144}
145finally
146{
147}
148}
149}
150
151[TaskName("ExtractVersion")]
152public class ExtractVersionTask : Task
153{
154private string _Property = null;
155
156[TaskAttribute("Property", Required=false)]
157public string Property
158{
159get { return _Property; }
160set { _Property = value; }
161}
162
163string _ResourceFile = null;
164
165[TaskAttribute("ResourceFile", Required=true)]
166public string ResourceFile
167{
168get { return _ResourceFile; }
169set { _ResourceFile = value; }
170}
171
172protected override void ExecuteTask()
173{
174try
175{
176TextReader reader = new StreamReader(_ResourceFile,Encoding.GetEncoding("GB2312"));
177string strFile = reader.ReadToEnd();
178reader.Close();
179
180string strVersion = ResourceFileManipulator.ExtractHeaderFileVersion(strFile);
181Properties[_Property] = strVersion;
182
183//Log(Level.Info, LogPrefix + "ResourceFile = [" + _ResourceFile + "] Property = [" + _Property + "]");
184}
185catch(System.Exception e)
186{
187throw new NAnt.Core.BuildException(e.Message,e);
188}
189}
190}
191}</build></revision></minor></major></wholeversion></build></revision></minor></major></wholeversion></build></revision></minor></major></wholeversion>