背景
以前用 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"