zoukankan      html  css  js  c++  java
  • 通过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。

  • 相关阅读:
    Elasticsearch 快速入门
    Linux 非互联网环境安装依赖包
    linux 安装mysql(rpm文件安装)
    Nginx安装与配置文件nginx.conf详解
    Linux 知识
    MySQL Windows安装连接
    post请求body格式
    MySQL 数据库备份
    SOAP与restful webservice
    大数据架构工具hadoop
  • 原文地址:https://www.cnblogs.com/neutra/p/1827585.html
Copyright © 2011-2022 走看看