背景

以前用 NANT 构建项目时,有个自动递增修订编号(Revision)的功能。现在转用 Visual C# 了,虽然可以用“[assembly: AssemblyVersion("1.0.0.*")]”的形式让编号自动递增,但递增数很大,而且不是从1开始。于是就写了个脚本,让修订编号(或构建编号)从现有的值开始,每次递增1。

原理

用脚本查找 AssemblyInfo.cs 里面 AssemblyVersion,修改相应的编号。
每次生成时调用此脚本,则可自动递增构建或修订编号。

脚本代码

var n = WScript.Arguments(0); // AssemblyInfo 文件名
var c = WScript.Arguments.length > 1 ? WScript.Arguments(1) : ""; // 生成配置
var s = new ActiveXObject("ADODB.Stream");
	s.Open();
	s.Type = 2;
	s.CharSet = "UTF-8"; //注意这个编码不用弄错,否则文件会被损坏。Visual Studio默认使用 UTF-8保存包含中文的代码文件 
	s.LoadFromFile (n);
var t = s.ReadText ();
var r = /\[assembly: AssemblyVersion \("(\d+\.\d+\.)(\d+)\.(\d+)"\)\]/g;
var a = r.exec(t);
if (a != null && a.length > 1) {
	var m = a[1]; // Major.Minor.
	var b = parseInt(a[2]); // Build
	var rv = parseInt(a[3]); // Revision
	if (c != "Release") { //根据构建配置修改编号 
		rv++;
	}
	else {
		b++;
	}
	var v = "[assembly: AssemblyVersion (\""+m+b+"."+rv+"\")]";
	WScript.StdOut.WriteLine ("更改程序集版本: " + a[0] + "->" + v);
	s.Position = 0;
	s.WriteText (t.replace(r, v));
	s.SaveToFile (n, 2);
}
else {
	WScript.StdErr.WriteLine ("错误: 找不到 AssemblyVersion 属性。");
}

使用方法

将上述代码保存为“AutoIncrementBuildNumber.js”,放在解决方案的目录。
在工程的预生成事件或生成后事件中,添加一行代码:
CScript.exe "$(SolutionDir)AutoIncrementBuildNumber.js" "$(SolutionDir)Properties\AssemblyInfo.cs" "$(ConfigurationName)"

每次 Debug 生成,修订编号增加1;每次 Release 生成,构建编号增加1。

如使用下面的代码,则只修改修订编号:
CScript.exe "$(SolutionDir)AutoIncrementBuildNumber.js" "$(SolutionDir)Properties\AssemblyInfo.cs"


如只希望在 Release 生成时才修改编号,可在命令前加条件,如:

if /I "$(ConfigurationName)" == "Release" CScript.exe "$(SolutionDir)AutoIncrementBuildNumber.js" "$(SolutionDir)Properties\AssemblyInfo.cs"
posted on 2011-02-25 16:31  PDF补丁丁  阅读(1665)  评论(5编辑  收藏  举报