持續建構需要辨別出每次建構的版本,而每次建構的時候人工去修改版本是不現實的。靠程式去添加版本号,有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><?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code><code>?></code>
<code><</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>></code>
<code> </code><code><</code><code>Import</code> <code>Project</code><code>=</code><code>"msbuildtasks\MSBuild.Community.Tasks.Targets"</code> <code>/></code>
<code> </code><code><</code><code>PropertyGroup</code><code>></code>
<code> </code><code><</code><code>MSBuildCommunityTasksLib</code><code>>$([MSBUILD]::Unescape(MSBuild.Community.Tasks.dll))</</code><code>MSBuildCommunityTasksLib</code><code>></code>
<code> </code><code></</code><code>PropertyGroup</code><code>></code>
<code> </code><code><</code><code>Target</code> <code>Name</code><code>=</code><code>"Test"</code><code>></code>
<code> </code><code><</code><code>ItemGroup</code><code>></code>
<code> </code><code><</code><code>AssemblyInfos</code> <code>Include</code><code>=</code><code>"..\MyProject\**\AssemblyInfo.cs"</code> <code>/></code>
<code> </code><code></</code><code>ItemGroup</code><code>></code>
<code> </code><code><</code><code>SvnVersion</code> <code>LocalPath</code><code>=</code><code>"."</code><code>></code>
<code> </code><code><</code><code>Output</code> <code>TaskParameter</code><code>=</code><code>"Revision"</code> <code>PropertyName</code><code>=</code><code>"Revision"</code> <code>/></code>
<code> </code><code></</code><code>SvnVersion</code><code>></code>
<code> </code><code><</code><code>Message</code> <code>Text</code><code>=</code><code>"Revision: $(Revision)"</code> <code>/></code>
<code> </code><code><</code><code>FileUpdate</code> <code>Files</code><code>=</code><code>"@(AssemblyInfos)"</code>
<code> </code><code>Regex</code><code>=</code><code>"\(&quot;(\d+\.\d+\.\d+\.)\d+&quot;\)\]"</code>
<code> </code><code>ReplacementText</code><code>=</code><code>"(&quot;${1}$(Revision)&quot;)]"</code> <code>/></code>
<code> </code><code></</code><code>Target</code><code>></code>
<code></</code><code>Project</code><code>></code>
稍稍解釋一下腳本:
這裡是引入 MSBuild Community Tasks 的動态庫,官方寫法,照抄就是了
這裡把所有 AssemblyInfo.cs 找出來,這樣可以将一個解決方案中多個項目的版本号一起更新了。
需要注意的是,在 PATH 路徑中可以找到 svnversion 指令。如果沒有設定 PATH,可以使用 ToolPath 參數指定 svnversion 所在目錄。
這部分就是通過正規表達式查找替換版本号了。有時有兩點需要注意,一是在寫引号的時候,需要用&quot;代替;二是在替換字元串中最好用${1}代替$1這種寫法,因為後面的$(Revision)也是數字,如果不用大括号連起來就可能變成 $1123 這樣,不能被正确識别,用一大括号就是 ${1}123 這樣了,不會出錯。
本文轉自邊城__ 51CTO部落格,原文連結:http://blog.51cto.com/jamesfancy/1425147,如需轉載請自行聯系原作者