msbuild构建时用SVN修改版本号代替AssemblyVersion的Revision版本号
持續(xù)構(gòu)建需要標(biāo)識(shí)出每次構(gòu)建的版本,而每次構(gòu)建的時(shí)候人工去修改版本是不現(xiàn)實(shí)的。靠程序去添加版本號(hào),有3種可選:1) 順序流水號(hào);2) 時(shí)間戳;3) SVN檢出代碼的修訂版本號(hào)
1) 順序流水號(hào)。需要每次構(gòu)建將上次記錄的流水號(hào)+1,再更新到版本中去。如果要記錄每次構(gòu)建的版本號(hào),需要提交到代碼器,不僅會(huì)造成代碼修訂版本+1,而且在構(gòu)建時(shí)提交東東總是件不爽的事情。
2) 時(shí)間戳。對(duì)比流水號(hào)來說,靠譜多了,就是太長,就算以秒為單位,一天也是86400的增量
3) SVN檢出代碼時(shí)的修訂版本號(hào)。最靠譜的還是這個(gè),代碼有更新,版本號(hào)增加,代碼沒更新,版本號(hào)不變。通常情況下,代碼不變,構(gòu)建結(jié)果基本上不需要有差異,所以選這個(gè)啦!
當(dāng)然這篇博文的關(guān)鍵不在這里,關(guān)鍵是咋才能讓MSBuild在構(gòu)建的時(shí)候去取得版本號(hào),并且替換掉AssemblyInfo.cs中的AssemblyVersion或AssemblyFileVersion。這要靠原生的MSBuild Task似乎是辦不到,自己寫Task太累。所以找了個(gè)第三方的Task:MSBuild Community Tasks。
其實(shí)這已經(jīng)不是第一次接觸 MSBuild Community Tasks 了,上次使用它是因?yàn)樾枰陧?xiàng)目構(gòu)建時(shí)將生成的結(jié)果打包成壓縮文件,所以用到了它的 Zip Task。而這次,需要用到它兩個(gè)Task:
SvnVersion Task,用來獲取代碼的SVN修訂版本號(hào)
FileUpdate,用來更新AssemblyInfo.cs文件
下面是實(shí)驗(yàn)環(huán)境和代碼:
首先是項(xiàng)目目錄結(jié)構(gòu)(test.xml就是 MSBuild 構(gòu)建腳本)
C:. ├─build │??│??test.xml │??│ │??└─msbuildtasks │??????????MSBuild.Community.Tasks.dll │??????????MSBuild.Community.Tasks.Targets │ └─MyProject└─PropertiesAssemblyInfo.cs構(gòu)建腳本只干了一件事件,就是更新 AssemblyInfo.cs 中兩個(gè)版本號(hào)的最后一位(修訂版本號(hào))。
<?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 的動(dòng)態(tài)庫,官方寫法,照抄就是了
這里把所有 AssemblyInfo.cs 找出來,這樣可以將一個(gè)解決方案中多個(gè)項(xiàng)目的版本號(hào)一起更新了。
這里很明顯就是在取當(dāng)前代碼的SVN修訂版本號(hào)了,LocalPath指定了取哪個(gè)目錄的版本號(hào),Output則將取到的修訂版本號(hào)輸出到“Revision”這個(gè)屬性中,關(guān)于Output,可以參考?http://msdn.microsoft.com/zh-cn/library/ms164287.aspx
需要注意的是,在 PATH 路徑中可以找到 svnversion 命令。如果沒有設(shè)置 PATH,可以使用 ToolPath 參數(shù)指定 svnversion 所在目錄。
這部分就是通過正則表達(dá)式查找替換版本號(hào)了。有時(shí)有兩點(diǎn)需要注意,一是在寫引號(hào)的時(shí)候,需要用"代替;二是在替換字符串中最好用${1}代替$1這種寫法,因?yàn)楹竺娴?(Revision)也是數(shù)字,如果不用大括號(hào)連起來就可能變成 $1123 這樣,不能被正確識(shí)別,用一大括號(hào)就是 ${1}123 這樣了,不會(huì)出錯(cuò)。
總結(jié)
以上是生活随笔為你收集整理的msbuild构建时用SVN修改版本号代替AssemblyVersion的Revision版本号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql server中同时执行selec
- 下一篇: 【万里征程——Windows App开发