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

  自从有了版本控制,Coder 似乎就多了一剂后悔药,让人爽的不行。有时我们会需要在程序中嵌入程序的编译信息,比如,版本修订号、编译日期等,这些对于发行程序和黑盒测试都是很有用的,可以让我们快速定位到数个发行版中的准确版本或者BUG所在。
  这里就是介绍如何"自动"同步SVN和程序集的版本信息,Coding 的目的就是让 Coder 更懒。
  要完成这个工作,首先要安装 TortoiseSVN及 Subversion,并让你的项目处于 SVN 的版本控制之下。
  P.S : 这里推荐 TortoiseSVN 和 AnkhSVN 一起管理项目,TortoiseSVN 做常见任务,AnkhSVN 主要用于在IDE中跟踪状态。
  
  首先,我们需要 SubWCRev.exe,这是由 TortoiseSVN 提供的实用工具,可以获取工作拷贝或版本库的一些信息并通过模板替换。
  这里我写了一个类似于函数的 AutoRevision.bat 脚本来直接简化我们的工作。
   
AutoRevision.bat :
None.gif :: < code >
None.gif::  
< revsion > $Rev:  4  $ </ revision >
None.gif::  
< owner name = " Zealic "  mail = " rszealic@gmail.com "   />
None.gif::
</ code >
None.gif::
-----------------------------
None.gif::
< summary >
None.gif::  根据指定的 SVN 工作目录的信息和模板生成目标文件。
None.gif::
</ summary >
None.gif::
< param name = " workDir " > 要获取信息的 SVN 工作目录。 </ param >
None.gif::
< param name = " template " > 模板文件路径。 </ param >
None.gif::
< param name = " target " > 生成的目标文件路径。 </ param >
None.gif::
< returns > 装载量 </ returns >
None.gif::
< remark >
None.gif::   当生成项目时 Visual Studio 如果已经打开 
% target %  参数指向的文件,那么可能导致模板替换更新不精确。
None.gif:: 导致该问题的原因是:SubWCRev.exe 修改了 
% target % ,但是 VS 检测到了这一情况,会弹出对话框询问用户。
None.gif:: 必须重新加载才可以,否则 VS 将会编译未替换过的 
% target %  文件。
None.gif::
</ remark >
None.gif::
=============================
None.gif
None.gif
None.gif::
-----------------------------
None.gif::
**  Initialize
None.gif@ECHO OFF
None.gifSETLOCAL ENABLEEXTENSIONS
None.gifREM Initialize Constants
None.gifSET TSVN_INFO_FILE
= .\TSVN_INFO.tmp
None.gifREM Initialize script arguments
None.gifSET workDir
=% 1
None.gifSET template
=% 2
None.gifSET target
=% 3
None.gif
None.gifREM Goto main entry
None.gifGOTO MAIN
None.gif::
=============================
None.gif
None.gif
None.gif::
-----------------------------
None.gif::
**  Main entry
None.gif:MAIN
None.gifpushd 
% workDir %
None.gifSET workDir
= .\
None.gif
None.gifREM 检查参数
None.gifIF 
% workDir %== ""  GOTO ARGUMENT_ERROR
None.gifIF 
% template %== ""  GOTO ARGUMENT_ERROR
None.gifIF 
% target %== ""  GOTO ARGUMENT_ERROR
None.gif
None.gifREM 查询注册表
None.gifreg query HKLM\SOFTWARE\TortoiseSVN 
/ v Directory  >   % TSVN_INFO_FILE %   2 > NUL
None.gif
None.gifREM 查找 TSVN 路径
None.gifFOR 
/ " tokens=* "   %% i IN ( % TSVN_INFO_FILE % ) DO (
None.gif  ECHO 
%% |  find  " Directory    REG_SZ "   >  NUL
None.gif  IF 
% ERRORLEVEL %   ==   0  (
None.gif    ECHO 
%% >   % TSVN_INFO_FILE %
None.gif  )
None.gif)
None.gifSET 
/ P TSVN_PATH =   <   % TSVN_INFO_FILE %
None.gifSET TSVN_PATH
=% TSVN_PATH: ~ 23 , - 1 %
None.gif
None.gifREM 调用 TSVN 替换模板
None.gifIF NOT 
% ERRORLEVEL %   ==   0  GOTO UNKNOW_ERROR
None.gif
" %TSVN_PATH%bin\SubWCRev.exe "   % workDir %   % template %   % target %
None.gifIF NOT 
% ERRORLEVEL %   ==   0  GOTO UNKNOW_ERROR
None.gifGOTO SUCESSED
None.gif::
=============================
None.gif
None.gif
None.gif::
-----------------------------
None.gif::
**  Error handlers
None.gif
None.gif:ARGUMENT_ERROR
None.gifECHO 传入的参数无效。
None.gifGOTO FAIL
None.gif
None.gif:NOT_FOUND_TSVN
None.gifECHO 查询TortoiseSVN 的安装信息失败。
None.gifGOTO FAIL
None.gif
None.gif:UNKNOW_ERROR
None.gifECHO 未知错误。
None.gif:FAIL
None.gif::
=============================
None.gif
None.gif::
-----------------------------
None.gif::
**  Program exit
None.gif:FAIL
None.gifDEL 
/ % TSVN_INFO_FILE %   2 > NUL
None.gifECHO 模板替换失败。
None.gifpopd
None.gifEXIT 
1
None.gif
None.gif:SUCESSED
None.gifDEL 
/ % TSVN_INFO_FILE %   2 > NUL
None.gifECHO 成功进行了模板替换。
None.gifpopd
None.gifEXIT 
0
None.gif::
=============================
None.gif

 
然后创建一个供脚本使用的模板 AssemblyInfo.tpl,内容如下:
AssemblyInfo.tpl
ExpandedBlockStart.gif ContractedBlock.gif /**/ /**
InBlock.gif<code>
InBlock.gif  <revsion>$Rev$ </revision>
InBlock.gif  <owner name="Zealic" mail="rszealic@gmail.com" />
InBlock.gif</code>
ExpandedBlockEnd.gif*
*/

None.gif
using  System.Reflection;
None.gif
using  System.Runtime.CompilerServices;
None.gif
using  System.Runtime.InteropServices;
None.gif
None.gif[assembly: AssemblyTitle(ThisAssembly.Title)]
None.gif[assembly: AssemblyDescription(ThisAssembly.Information)]
None.gif[assembly: AssemblyConfiguration(
" From Mars. " )]
None.gif[assembly: AssemblyCompany(
" Google " )]
None.gif[assembly: AssemblyCopyright(
" 版权所有 (C) Baidu 2007 " )]
None.gif[assembly: AssemblyDefaultAlias(
" Live " )]
None.gif[assembly: AssemblyProduct(
" RevTest " )]
None.gif[assembly: AssemblyTrademark(
" Yahoo! " )]
None.gif[assembly: AssemblyCulture(
"" )]
None.gif[assembly: ComVisible(
false )]
None.gif[assembly: Guid(
" 3FBDB8EE-61FB-46ef-8B61-CC28F46C08B9 " )]
None.gif[assembly: AssemblyVersion(ThisAssembly.Version)]
None.gif[assembly: AssemblyFileVersion(ThisAssembly.FileVersion)]
None.gif
None.gif
internal   static   class  ThisAssembly
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public const string Title = "RevTest";
InBlock.gif    
public const string Version = "1.2.0." + Revision;
InBlock.gif    
public const string FileVersion = Version;
InBlock.gif
InBlock.gif    
public const string BuildTime = "$WCNOW$";
InBlock.gif    
public const string Revision = "$WCREV$";
InBlock.gif    
public const string RevisionRange = "$WCRANGE$";
InBlock.gif    
public const string RevisionMixed = "$WCMIXED?True:False$";
InBlock.gif    
public const string RevisionModified = "$WCMODS?True:False$";
InBlock.gif
InBlock.gif    
public const string Information = "Name=" + Title + "\r\n"
InBlock.gif
#if DEBUG
InBlock.gif 
+ "Build=DEBUG\r\n"
InBlock.gif
#elif RELEASE
InBlock.gif        
+ "Build=RELEASE\r\n"
InBlock.gif
#else
InBlock.gif        
+ "Build=UNKNOW\r\n"
InBlock.gif
#endif
InBlock.gif 
+ "Revision=" + Revision + "\r\n"
InBlock.gif        
+ "RevRange=" + RevisionRange + "\r\n"
InBlock.gif        
+ "RevMixed=" + RevisionMixed + "\r\n"
InBlock.gif        
+ "Modified=" + RevisionModified + "\r\n\r\n"
InBlock.gif        
+ BuildTime + "\r\n";
InBlock.gif
ExpandedBlockEnd.gif}

None.gif


  之后为项目添加预生成事件处理命令:
  在 属性->项目生成事件->预生成事件命令行 中键入如下代码 :
None.gif " $(ProjectDir)\Properties\AutoRevision.bat "   " $(ProjectDir) "  .\Properties\AssemblyInfo.tpl .\Properties\AssemblyInfo.cs


这样,程序就可以在每次编译的时候自动更新程序集信息了,我们可以在 <AssemblyFile>.exe->属性->版本->备注中看到如下信息:
None.gif Name = RevTest
None.gifBuild
= DEBUG
None.gifRevision
= 4
None.gifRevRange
= 4
None.gifRevMixed
= False
None.gifModified
= False
None.gif
None.gif
2007 / 12 / 05   19 : 00 : 35
None.gif


示例工程下载 :  RevTest.rar

转载于:https://www.cnblogs.com/zealic/archive/2007/12/05/984026.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值