msbuild构建时用SVN修改版本号代替AssemblyVersion的Revision版本号

简介:

持续构建需要标识出每次构建的版本,而每次构建的时候人工去修改版本是不现实的。靠程序去添加版本号,有3种可选:1) 顺序流水号;2) 时间戳;3) SVN检出代码的修订版本号


1) 顺序流水号。需要每次构建将上次记录的流水号+1,再更新到版本中去。如果要记录每次构建的版本号,需要提交到代码器,不仅会造成代码修订版本+1,而且在构建时提交东东总是件不爽的事情。

2) 时间戳。对比流水号来说,靠谱多了,就是太长,就算以秒为单位,一天也是86400的增量

3) SVN检出代码时的修订版本号。最靠谱的还是这个,代码有更新,版本号增加,代码没更新,版本号不变。通常情况下,代码不变,构建结果基本上不需要有差异,所以选这个啦!


当然这篇博文的关键不在这里,关键是咋才能让MSBuild在构建的时候去取得版本号,并且替换掉AssemblyInfo.cs中的AssemblyVersion或AssemblyFileVersion。这要靠原生的MSBuild Task似乎是办不到,自己写Task太累。所以找了个第三方的Task:MSBuild Community Tasks


其实这已经不是第一次接触 MSBuild Community Tasks 了,上次使用它是因为需要在项目构建时将生成的结果打包成压缩文件,所以用到了它的 Zip Task。而这次,需要用到它两个Task:


SvnVersion Task,用来获取代码的SVN修订版本号

FileUpdate,用来更新AssemblyInfo.cs文件


下面是实验环境和代码:


首先是项目目录结构(test.xml就是 MSBuild 构建脚本)

1
2
3
4
5
6
7
8
9
10
11
C:.
├─build
│  │   test .xml
│  │
│  └─msbuildtasks
│          MSBuild.Community.Tasks.dll
│          MSBuild.Community.Tasks.Targets
└─MyProject
     └─Properties
             AssemblyInfo.cs


构建脚本只干了一件事件,就是更新 AssemblyInfo.cs 中两个版本号的最后一位(修订版本号)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<? xml  version = "1.0"  encoding = "utf-8" ?>
< Project  ToolsVersion = "4.0"  DefaultTargets = "Test"  xmlns = "http://schemas.microsoft.com/developer/msbuild/2003" >
     < Import  Project = "msbuildtasks\MSBuild.Community.Tasks.Targets"  />
     < PropertyGroup >
         < MSBuildCommunityTasksLib >$([MSBUILD]::Unescape(MSBuild.Community.Tasks.dll))</ MSBuildCommunityTasksLib >
     </ PropertyGroup >
 
     < Target  Name = "Test" >
         < ItemGroup >
             < AssemblyInfos  Include = "..\MyProject\**\AssemblyInfo.cs"  />
         </ ItemGroup >
 
         < SvnVersion  LocalPath = "." >
             < Output  TaskParameter = "Revision"  PropertyName = "Revision"  />
         </ SvnVersion >
 
         < Message  Text = "Revision: $(Revision)"  />
 
         < FileUpdate  Files = "@(AssemblyInfos)"
             Regex = "\(&quot;(\d+\.\d+\.\d+\.)\d+&quot;\)\]"
             ReplacementText = "(&quot;${1}$(Revision)&quot;)]"  />
     </ Target >
</ Project >


稍稍解释一下脚本:


1
2
3
4
     < Import  Project = "msbuildtasks\MSBuild.Community.Tasks.Targets"  />
     < PropertyGroup >
         < MSBuildCommunityTasksLib >$([MSBUILD]::Unescape(MSBuild.Community.Tasks.dll))</ MSBuildCommunityTasksLib >
     </ PropertyGroup >

这里是引入 MSBuild Community Tasks 的动态库,官方写法,照抄就是了


1
2
3
         < ItemGroup >
             < AssemblyInfos  Include = "..\MyProject\**\AssemblyInfo.cs"  />
         </ ItemGroup >

这里把所有 AssemblyInfo.cs 找出来,这样可以将一个解决方案中多个项目的版本号一起更新了。


1
2
3
         < SvnVersion  LocalPath = "." >
             < Output  TaskParameter = "Revision"  PropertyName = "Revision"  />
         </ SvnVersion >

这里很明显就是在取当前代码的SVN修订版本号了,LocalPath指定了取哪个目录的版本号,Output则将取到的修订版本号输出到“Revision”这个属性中,关于Output,可以参考 http://msdn.microsoft.com/zh-cn/library/ms164287.aspx


需要注意的是,在 PATH 路径中可以找到 svnversion 命令。如果没有设置 PATH,可以使用 ToolPath 参数指定 svnversion 所在目录。


1
2
3
         < FileUpdate  Files = "@(AssemblyInfos)"
             Regex = "\(&quot;(\d+\.\d+\.\d+\.)\d+&quot;\)\]"
             ReplacementText = "(&quot;${1}$(Revision)&quot;)]"  />

这部分就是通过正则表达式查找替换版本号了。有时有两点需要注意,一是在写引号的时候,需要用&quot;代替;二是在替换字符串中最好用${1}代替$1这种写法,因为后面的$(Revision)也是数字,如果不用大括号连起来就可能变成 $1123 这样,不能被正确识别,用一大括号就是 ${1}123 这样了,不会出错。



本文转自边城__ 51CTO博客,原文链接:http://blog.51cto.com/jamesfancy/1425147,如需转载请自行联系原作者
相关文章
|
Android开发
Android Studio 用svn回退版本、svn恢复到指定版本、一键恢复 撤回修改
Android Studio 用svn回退版本、svn恢复到指定版本、一键恢复 撤回修改
545 0
Android Studio 用svn回退版本、svn恢复到指定版本、一键恢复 撤回修改
SVN 提交代码后面如何修改日志信息
SVN 提交代码后面如何修改日志信息
1163 0
|
Java Linux Windows
LINUX没有SVN,怎么知道哪些文件修改了
LINUX没有SVN,怎么知道哪些文件修改了
120 0
|
Java Maven
SpringBoot Maven打包包含时间戳和svn版本号
1.修改pom.xml在里面添加 com.google.code.maven-svn-revision-number-plugin ...
5728 0
|
C# C++
VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中(C#)
原文:VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中(C#) 在开发项目时,需要知道当前发布的到底是哪个版本,比较好的方式就是获取SVN的版本来作为项目的版本。
2157 0
|
Windows
修改服务的运行权限,解决SVN Post Commit问题
先来看一下错误现象 之前在Windows Server中安装了VirtualSVN Server,然后设置了Post Commit Hooks,在提交代码到版本库之后,将代码check到本地的一个Server目录。
1352 0