天天看点

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

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

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

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

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

其实这已经不是第一次接触 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

<code>C:.</code>

<code>├─build</code>

<code>│  │  </code><code>test</code><code>.xml</code>

<code>│  │</code>

<code>│  └─msbuildtasks</code>

<code>│          MSBuild.Community.Tasks.dll</code>

<code>│          MSBuild.Community.Tasks.Targets</code>

<code>│</code>

<code>└─MyProject</code>

<code>    </code><code>└─Properties</code>

<code>            </code><code>AssemblyInfo.cs</code>

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

12

13

14

15

16

17

18

19

20

21

22

23

<code>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code><code>?&gt;</code>

<code>&lt;</code><code>Project</code> <code>ToolsVersion</code><code>=</code><code>"4.0"</code> <code>DefaultTargets</code><code>=</code><code>"Test"</code> <code>xmlns</code><code>=</code><code>"http://schemas.microsoft.com/developer/msbuild/2003"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>Import</code> <code>Project</code><code>=</code><code>"msbuildtasks\MSBuild.Community.Tasks.Targets"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>PropertyGroup</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>MSBuildCommunityTasksLib</code><code>&gt;$([MSBUILD]::Unescape(MSBuild.Community.Tasks.dll))&lt;/</code><code>MSBuildCommunityTasksLib</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>PropertyGroup</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>Target</code> <code>Name</code><code>=</code><code>"Test"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>ItemGroup</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>AssemblyInfos</code> <code>Include</code><code>=</code><code>"..\MyProject\**\AssemblyInfo.cs"</code> <code>/&gt;</code>

<code>        </code><code>&lt;/</code><code>ItemGroup</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>SvnVersion</code> <code>LocalPath</code><code>=</code><code>"."</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>Output</code> <code>TaskParameter</code><code>=</code><code>"Revision"</code> <code>PropertyName</code><code>=</code><code>"Revision"</code> <code>/&gt;</code>

<code>        </code><code>&lt;/</code><code>SvnVersion</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>Message</code> <code>Text</code><code>=</code><code>"Revision: $(Revision)"</code> <code>/&gt;</code>

<code>        </code><code>&lt;</code><code>FileUpdate</code> <code>Files</code><code>=</code><code>"@(AssemblyInfos)"</code>

<code>            </code><code>Regex</code><code>=</code><code>"\(&amp;quot;(\d+\.\d+\.\d+\.)\d+&amp;quot;\)\]"</code>

<code>            </code><code>ReplacementText</code><code>=</code><code>"(&amp;quot;${1}$(Revision)&amp;quot;)]"</code> <code>/&gt;</code>

<code>    </code><code>&lt;/</code><code>Target</code><code>&gt;</code>

<code>&lt;/</code><code>Project</code><code>&gt;</code>

稍稍解释一下脚本:

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

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

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

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

本文转自边城__ 51CTO博客,原文链接:http://blog.51cto.com/jamesfancy/1425147,如需转载请自行联系原作者

继续阅读