通过SVN自动更新程序集版本信息

   VS可以指定[assembly: AssemblyVersion("1.0.*")]这样的版本号,每次编译程序集时自动递增Build和Revision。今天同事说到这个自动递增的Revision对于查错作用不大,建议用SVN版本号作为程序集的版本的尾号。我觉得很有道理,于是在上网里查了下方法,比较遗憾的是只查到一篇文章(雷同不算)《通过 TSVN 自动更新程序集版本信息》。

  文章里介绍了方法比较复杂,大致如下:

  1. 做一个包含[assembly: AssemblyVersion()]的模板

  2. 写一个批处理脚本。脚本通过查找注册表定位到TortoiseSVN里的一个小工具SubWCRev.exe的路径,然后调用这个小工具对模板进行操作 

  3. 在项目预生成事件中调用该批处理脚本,传入项目路径、模板路径和输出路径

  4. 将输出的文件包含在项目中,并在SVN中排除对该文件的管理

  我很赞同这个思路,但是觉得通过注册表来查找SubWCRev.exe的路径太费劲。印象中这种工具类的小程序一般都可以直接复制出来单独使用的,就像微软的.Net Framework SDK自带的那些小工具一样。于是我试着将这个SubWCRev.exe复制到D盘,然后命令行执行,发现真的可以执行。说明这个方法还可以改进,直接在预生成事件里调用包含在解决方案中的SubWCRev.exe。

  我给自己的项目写了个模板(加了个#warning,如果当前编译时有代码有修改就产生一个警告):

AssemblyRevision.cs
//--------------------------------------------------
// <auto-generated>
// Assembly Version
// 此代码由工具生成。
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//--------------------------------------------------

using System.Reflection;
using System.Resources;
using System.Runtime.InteropServices;

[assembly: ComVisible(
false)]
[assembly: AssemblyCompany(
"my corp")]
[assembly: AssemblyProduct(
"my product")]
[assembly: AssemblyCopyright(
"2010")]
[assembly: AssemblyVersion(AssemblyRevision.FullVersion)]
[assembly: AssemblyFileVersion(AssemblyRevision.FullVersion)]
[assembly: NeutralResourcesLanguage(
"zh-CN")]

internal static class AssemblyRevision
{
public const string Major = "1";
public const string Minor = "0";
public const string Build = "0";
public const string Revision = "$WCREV$";

public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

public const string BuildTime = "$WCNOW$";
public const string RevisionRange = "$WCRANGE$";
public const bool RevisionMixed = $WCMIXED?true:false$;
public const bool RevisionModified = $WCMODS?true:false$;

$WCMODS
?#warning Revision modified:$
}

  然后写了个简单的批处理GenerateRevision.bat,目的是减少项目生成事件那边调用时写得代码量不用太长,%~dp0代表批处理所处的目录路径
  @"%~dp0SubWCRev.exe" %1 "%~dp0AssemblyRevision.cs" %2

 

  将这AssemblyRevision.cs、GenerateRevision.bat和SubWCRev.exe一起放在解决方案目录下的Tools目录下,并添加到源代码管理。然后对解决方案里的每个项目进行以下操作:将模板里指定过的Assembly级Attribute去掉(通常在Properties\AssemblyInfo.cs里),在项目预生成事件里加入:

  "$(SolutionDir)Tools\GenerateRevision.bat" "$(ProjectDir)." "$(ProjectDir).AssemblyRevision.cs"

  重新生成项目,将各项目目录生成的.AssemblyRevision.cs添加到项目中(前面加个点是为了排序时可以靠前,比较醒目……),并添加到忽略列表(不然每次编译SVN发现该文件变化了又提示有文件已修改)。再重新编译一次就行了,以后每次编译都会自动将SVN的版本设为程序集的Revision。

posted @ 2010-09-16 00:42  neutra  阅读(2973)  评论(0编辑  收藏  举报