NAnt扩展Task源代码: 读取及增加资源文件中的版本号

在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 + "] ---&gt; 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>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus