在实际项目中(特别是作为产品的项目),版本号是必不可少的一部分。版本号的规则也有许多种,在此不讨论具体的编码规范。对于迭代的产品,版本繁多,特别是有多个实施项目所使用产品的版本不同(基于定制需求)时,清楚的标识组件与代码的对应关系十分重要。

本文主要说明如何在 .Net 项目使用 SVN 作为版本控制工具时生成与代码对应的组件版本号。

我们知道,SVN 在 commit 时会生成一串数字作为序号,所以基本思路是把这个序号作为 . Net 项目编译后生成dll的文件版本号的最后一段。下面所列方法需要使用到TortoiseSVN 提供的 SubWCRev.exe 。

首先,我们需要通过注册表查找 TortoiseSVN 的安装目录。

Rem Search TSVN Path
For /f "tokens=*" %%i In ('Reg Query HKLM\Software\TortoiseSVN /v Directory') Do (
ECHO %%i | Find "Directory">NUL
IF %ERRORLEVEL% == 0 (For /f "tokens=1,2,*" %%j In ("%%i") Do (SET TSVN_PATH=%%1))
)
SET TSVN_PATH=%TSVN_PATH%bin\SubWCRev.exe

1 Rem Search TSVN Path
2 For /f "tokens=*" %%i In ('Reg Query HKLM\Software\TortoiseSVN /v Directory') Do (
3 ECHO %%i | Find "Directory">NUL
4 IF %ERRORLEVEL% == 0 (For /f "tokens=1,2,*" %%j In ("%%i") Do (SET TSVN_PATH=%%1))
5 )
6 SET TSVN_PATH=%TSVN_PATH%bin\SubWCRev.exe

SubWCRev 是通过替换文件中指定的关键字来实现获得 commit 序号的,点击查看详细的列表。

然后我们建立以一个 AssemblyInfo.tpl 作为替换使用的模板,由于 AssemblyInfo.cs 中除了固定的值外还有类似 GUID 变化的值,所以我们不能全部替换,因此仅将需要修改的部分放在 tpl 中,内容如下:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]

接下来使用批处理替换原来的 AssemblyInfo.cs 文件,为了在每次编译时都自动替换,我们把调用批处理的命令写在项目生成事件的生成前事件中,例如下面这样:

"(TargetDir)BeforeBuildProject.bat""(TargetDir)BeforeBuildProject.bat""(ProjectDir)" "$(TargetDir)AssemblyInfo.tpl" .\Properties\AssemblyInfo.cs

$(TargetDir)表示编译输出目录,更多可用全局变量请在生成事件中点击“宏”查看。

替换 AssemblyInfo.cs 的批处理代码:

SET WorkDir=%1
SET Template=%2
SET target=%3
SET AssemblyInfo=ASSEMBLY_INFO.tmp

PushD %WorkDir%
SET WorkDir=.\

Rem Generate a template file
FindStr /v "AssemblyVersion AssemblyFileVersion" %target% > %AssemblyInfo%
FindStr ".*" %Template% >> %AssemblyInfo%

Rem Using TSVN Replace Tlp
"%TSVN_PATH%" %WorkDir% %AssemblyInfo% %target%>NUL

 1 SET WorkDir=%1
2 SET Template=%2
3 SET target=%3
4 SET AssemblyInfo=ASSEMBLY_INFO.tmp
5
6 PushD %WorkDir%
7 SET WorkDir=.\
8
9 Rem Generate a template file
10 FindStr /v "AssemblyVersion AssemblyFileVersion" %target% > %AssemblyInfo%
11 FindStr ".*" %Template% >> %AssemblyInfo%
12
13 Rem Using TSVN Replace Tlp
14 "%TSVN_PATH%" %WorkDir% %AssemblyInfo% %target%>NUL

当然这样还不是一劳永逸,你会发现每次编译 AssemblyInfo.cs 文件都会变化,因此你的 commit 序号也会一直跟着增加,这并不是我们所想要的效果。这里提出一种解决方案,在每次替换后生成 dll 后又将 AssemblyInfo.cs 还原回去。

为此,我们在生成前事件中增加备份命令:

COPY /y "%target%" "%target%.bak">NUL

然后增加生成后事件,调用命令为:

"(TargetDir)AfterBuildProject.bat""(TargetDir)AfterBuildProject.bat""(ProjectDir)Properties\AssemblyInfo.cs"

在 AfterBuildProject.bat 中我们需要完成还原  AssemblyInfo.cs 和删除备份文件的工作,代码如下:

 SET target=%
COPY "%target%.bak" %target%
DEL /Q "%target%.bak" >NUL

就此,每次编译时,系统都会自动将 commit 序号放到 dll 的文件版本中了。

完整代码下载:点击下载

本文来自 NewIdea 的博客,作者 Carey Tzou 。

原文地址:http://www.cnblogs.com/NewIdea/p/AutoVersion.html

开发日记:在VS项目中使用SVN版本号作为编译版本号的更多相关文章

  1. 在VS项目中通过GIT生成版本号作为编译版本号

    上一篇博客写了如何在 .Net 项目使用 SVN 作为版本控制工具时生成与代码对应的组件版本号.虽然在公司一直使用 SVN ,但我却对 GIT 情有独钟(可能要归功于那段捣鼓 ROM 的时光),但少有 ...

  2. 在VS项目中使用SVN版本号作为编译版本号

    在实际项目中(特别是作为产品的项目),版本号是必不可少的一部分.版本号的规则也有许多种,在此不讨论具体的编码规范.对于迭代的产品,版本繁多,特别是有多个实施项目所使用产品的版本不同(基于定制需求)时, ...

  3. 十、VueJs 填坑日记之在项目中使用Amaze UI

    上一篇博文,我们把jQuery集成到了项目中,今天我们来集成Amaze ui(妹子UI).先来介绍一下妹子UI.Amaze UI 含近 20 个 CSS 组件.20 余 JS 组件,更有多个包含不同主 ...

  4. Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决

    问题描述: mac笔记本本身会自带几个python版本,比如python2.7版本,我没有改动mac默认的python版本,只是安装了python3.7版本. 使用Pycharm开发Python项目没 ...

  5. iOS开发多线程在实际项目中的运用

    实际项目开发中为了能够给用户更好的体验,有些延时操作我们都会放在子线程中进行. 今天我们就来聊聊多线程在实际项目中的运用. 我们先来看看多线程的基础知识: 1.多线程的原理: 同一时间,CPU只能处理 ...

  6. iOS开发小技巧--微博项目中的键盘工具条

    微博项目中的键盘工具条 项目中的键盘工具条不能使用inputAccessoryView,因为inputAccessoryView不能实现键盘隐藏的时候,工具条还显示在眼前,如图: 所以,果断决定将工具 ...

  7. 关于在Java EE 下开发web,出现项目中的外部包没有tomcat的包的原因

    在新建的项目的时候,要设置目标服务器运行环境,把那个设置成tomcat,这样,项目中就会有tomca的api

  8. 九、VueJs 填坑日记之在项目中使用jQuery

    很多人学习 js 都是从 jQuery 开始的,我也不例外.有时候进行一些操作的时候,还是感觉 jQuery 比较好用,那么,我们如何在项目中使用 jQuery 呢?这篇博文带你实践. 引用 jQue ...

  9. 【iOS开发】在ARC项目中使用非ARC文件

    ARC的出现应该说是开发者的一大福利,苹果是推荐使用的,但是因为之前没有ARC机制,好多比较好的类库都是使用的非ARC,或是有些大牛还是不喜欢用ARC,封装的类也是非ARC的,想要在自己的ARC项目中 ...

随机推荐

  1. SpringBoot项目的测试类

    1. package soundsystem; import static org.junit.Assert.*; import org.junit.Test; import org.junit.ru ...

  2. 2019牛客暑期多校训练营(第六场)C:Palindrome Mouse(回文树+树剖)

    题意:给定字符串Str,求出回文串集合为S,问S中的(a,b)满足a是b的子串的对数. 思路:开始和题解的思路差不多,维护当前后缀的每个串的最后出现位置,但是不知道怎么套“最小回文分割”,所以想到了树 ...

  3. w5500驱动使用方法调试笔记

    1.w5500有两种方式可以运行的,server端一般用中断的方式,效率比较高,client使用查询的模式,本身自带2k的发送缓存和2k的接收缓存.2.查询模式:有数据的时候,查询模式可以每隔一段时间 ...

  4. kvo与runtime

    创建新类 添加方法 isa-swizzling 测试方案: 添加全局断点 objc_allocateClassPair objc_registerClassPair class_addMethod l ...

  5. Zigzag Iterator II

    Description Follow up Zigzag Iterator: What if you are given k 1d vectors? How well can your code be ...

  6. 树莓派项目(三) 数字识别树莓派3+python3.5+opencv3.3+tensorflow1.7+keras

    https://blog.csdn.net/weixin_40707450/article/details/80290705

  7. MongoDB repairDatabase 释放磁盘空间

    repairDatabase是官方文档中认为唯一可以回收硬盘空间的方法. repairDatabase is the appropriate and the only way to reclaim d ...

  8. MySQL中列别名为中文时,Order by 子句中使用别名时不要加引号

    暂时还不清楚原因 1.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 SC表: 这里,当做总成绩处理 select sid, sum(score) as '总成绩', avg(score) ...

  9. Vue的SEO问题汇总

    方式一 思否 https://segmentfault.com/q/1010000011824706 SSR 和 Nuxt.js : https://zh.nuxtjs.org/ https://se ...

  10. [SDOI2010]捉迷藏 K-Dtree

    [SDOI2010]捉迷藏 链接 luogu 思路 k-dtree模板题 代码 #include <bits/stdc++.h> #define ls (t[u].ch[0]) #defi ...