日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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="\(&quot;(\d+\.\d+\.\d+\.)\d+&quot;\)\]"ReplacementText="(&quot;${1}$(Revision)&quot;)]"?/></Target> </Project>


稍稍解釋一下腳本:


????<Import?Project="msbuildtasks\MSBuild.Community.Tasks.Targets"?/><PropertyGroup><MSBuildCommunityTasksLib>$([MSBUILD]::Unescape(MSBuild.Community.Tasks.dll))</MSBuildCommunityTasksLib></PropertyGroup>

這里是引入 MSBuild Community Tasks 的動態庫,官方寫法,照抄就是了


????????<ItemGroup><AssemblyInfos?Include="..\MyProject\**\AssemblyInfo.cs"?/></ItemGroup>

這里把所有 AssemblyInfo.cs 找出來,這樣可以將一個解決方案中多個項目的版本號一起更新了。


????????<SvnVersion?LocalPath="."><Output?TaskParameter="Revision"?PropertyName="Revision"?/></SvnVersion>

這里很明顯就是在取當前代碼的SVN修訂版本號了,LocalPath指定了取哪個目錄的版本號,Output則將取到的修訂版本號輸出到“Revision”這個屬性中,關于Output,可以參考?http://msdn.microsoft.com/zh-cn/library/ms164287.aspx


需要注意的是,在 PATH 路徑中可以找到 svnversion 命令。如果沒有設置 PATH,可以使用 ToolPath 參數指定 svnversion 所在目錄。


????????<FileUpdate?Files="@(AssemblyInfos)"Regex="\(&quot;(\d+\.\d+\.\d+\.)\d+&quot;\)\]"ReplacementText="(&quot;${1}$(Revision)&quot;)]"?/>

這部分就是通過正則表達式查找替換版本號了。有時有兩點需要注意,一是在寫引號的時候,需要用&quot;代替;二是在替換字符串中最好用${1}代替$1這種寫法,因為后面的$(Revision)也是數字,如果不用大括號連起來就可能變成 $1123 這樣,不能被正確識別,用一大括號就是 ${1}123 這樣了,不會出錯。



總結

以上是生活随笔為你收集整理的msbuild构建时用SVN修改版本号代替AssemblyVersion的Revision版本号的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。