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 構建腳本)
C:. ├─build │??│??test.xml │??│ │??└─msbuildtasks │??????????MSBuild.Community.Tasks.dll │??????????MSBuild.Community.Tasks.Targets │ └─MyProject└─PropertiesAssemblyInfo.cs構建腳本只干了一件事件,就是更新 AssemblyInfo.cs 中兩個版本號的最后一位(修訂版本號)。
<?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="\("(\d+\.\d+\.\d+\.)\d+"\)\]"ReplacementText="("${1}$(Revision)")]"?/></Target> </Project>稍稍解釋一下腳本:
這里是引入 MSBuild Community Tasks 的動態庫,官方寫法,照抄就是了
這里把所有 AssemblyInfo.cs 找出來,這樣可以將一個解決方案中多個項目的版本號一起更新了。
這里很明顯就是在取當前代碼的SVN修訂版本號了,LocalPath指定了取哪個目錄的版本號,Output則將取到的修訂版本號輸出到“Revision”這個屬性中,關于Output,可以參考?http://msdn.microsoft.com/zh-cn/library/ms164287.aspx
需要注意的是,在 PATH 路徑中可以找到 svnversion 命令。如果沒有設置 PATH,可以使用 ToolPath 參數指定 svnversion 所在目錄。
這部分就是通過正則表達式查找替換版本號了。有時有兩點需要注意,一是在寫引號的時候,需要用"代替;二是在替換字符串中最好用${1}代替$1這種寫法,因為后面的$(Revision)也是數字,如果不用大括號連起來就可能變成 $1123 這樣,不能被正確識別,用一大括號就是 ${1}123 這樣了,不會出錯。
總結
以上是生活随笔為你收集整理的msbuild构建时用SVN修改版本号代替AssemblyVersion的Revision版本号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql server中同时执行selec
- 下一篇: [java] 找出字符串中出现最多的字符