开发日记:在VS项目中使用SVN版本号作为编译版本号
在实际项目中(特别是作为产品的项目),版本号是必不可少的一部分。版本号的规则也有许多种,在此不讨论具体的编码规范。对于迭代的产品,版本繁多,特别是有多个实施项目所使用产品的版本不同(基于定制需求)时,清楚的标识组件与代码的对应关系十分重要。
本文主要说明如何在 .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版本号作为编译版本号的更多相关文章
- 在VS项目中通过GIT生成版本号作为编译版本号
上一篇博客写了如何在 .Net 项目使用 SVN 作为版本控制工具时生成与代码对应的组件版本号.虽然在公司一直使用 SVN ,但我却对 GIT 情有独钟(可能要归功于那段捣鼓 ROM 的时光),但少有 ...
- 在VS项目中使用SVN版本号作为编译版本号
在实际项目中(特别是作为产品的项目),版本号是必不可少的一部分.版本号的规则也有许多种,在此不讨论具体的编码规范.对于迭代的产品,版本繁多,特别是有多个实施项目所使用产品的版本不同(基于定制需求)时, ...
- 十、VueJs 填坑日记之在项目中使用Amaze UI
上一篇博文,我们把jQuery集成到了项目中,今天我们来集成Amaze ui(妹子UI).先来介绍一下妹子UI.Amaze UI 含近 20 个 CSS 组件.20 余 JS 组件,更有多个包含不同主 ...
- Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决
问题描述: mac笔记本本身会自带几个python版本,比如python2.7版本,我没有改动mac默认的python版本,只是安装了python3.7版本. 使用Pycharm开发Python项目没 ...
- iOS开发多线程在实际项目中的运用
实际项目开发中为了能够给用户更好的体验,有些延时操作我们都会放在子线程中进行. 今天我们就来聊聊多线程在实际项目中的运用. 我们先来看看多线程的基础知识: 1.多线程的原理: 同一时间,CPU只能处理 ...
- iOS开发小技巧--微博项目中的键盘工具条
微博项目中的键盘工具条 项目中的键盘工具条不能使用inputAccessoryView,因为inputAccessoryView不能实现键盘隐藏的时候,工具条还显示在眼前,如图: 所以,果断决定将工具 ...
- 关于在Java EE 下开发web,出现项目中的外部包没有tomcat的包的原因
在新建的项目的时候,要设置目标服务器运行环境,把那个设置成tomcat,这样,项目中就会有tomca的api
- 九、VueJs 填坑日记之在项目中使用jQuery
很多人学习 js 都是从 jQuery 开始的,我也不例外.有时候进行一些操作的时候,还是感觉 jQuery 比较好用,那么,我们如何在项目中使用 jQuery 呢?这篇博文带你实践. 引用 jQue ...
- 【iOS开发】在ARC项目中使用非ARC文件
ARC的出现应该说是开发者的一大福利,苹果是推荐使用的,但是因为之前没有ARC机制,好多比较好的类库都是使用的非ARC,或是有些大牛还是不喜欢用ARC,封装的类也是非ARC的,想要在自己的ARC项目中 ...
随机推荐
- Dapper 一对多查询 one to many
参考文档:Dapper one to many Table public class Person { public int Id { get; set; } public string Name { ...
- python笔记44-HTTP对外接口sign签名
前言 一般公司对外的接口都会用到sign签名,对不同的客户提供不同的apikey ,这样可以提高接口请求的安全性,避免被人抓包后乱请求. sign签名是一种很常见的方式 sign签名 签名参数sign ...
- .gitignore 标准模板 -适用于SpringBoot+Vue项目 -Idea+VSCode开发
.gitignore 标准模板 -适用于SpringBoot+Vue项目 node_modules/ target/ !.mvn/wrapper/maven-wrapper.jar ### STS # ...
- 201671030102陈飞 实验十四 团队项目评审&课程学习总结
项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 课程学习目标 1.掌握软件项目评审会议流程 ...
- Python bytes类型及用法
bytes 类型 Python 3 新增了 bytes 类型,用于代表字节串,是一个类型,不是C#中的列表. 字符串(str)由多个字符组成,以字符为单位进行操作: 字节串(bytes)由多个字节组成 ...
- spark调优——Shuffle调优
在Spark任务运行过程中,如果shuffle的map端处理的数据量比较大,但是map端缓冲的大小是固定的,可能会出现map端缓冲数据频繁spill溢写到磁盘文件中的情况,使得性能非常低下,通过调节m ...
- my OD
1 复习c文件处理内容 2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写Makefile 5 提交测试代码和运行 ...
- Numpy | 13 位运算
NumPy "bitwise_" 开头的函数是位运算函数.本章都是按二进制来操作的. NumPy 位运算包括以下几个函数: 函数 描述 bitwise_and 对数组元素执行位与操 ...
- 数组排序代码,冒泡排序&快速排序&选择排序
冒泡排序: for(var i=0;i<arr.length-1;i++){ for(var j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1 ...
- js时间练习
编写代码,将当前日期按"2017-12-27 11:11 星期三"格式输出 var t1 = new Date(); console.log(t1.toLocaleString() ...