天天看點

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,如需轉載請自行聯系原作者

繼續閱讀