本文位址:https://www.cnblogs.com/Jack-Blog/p/11108136.html
作者部落格:傑哥很忙
目的
本章文章主要是通過調用svn用戶端指令和powershell腳本實作完全無需人工幹預自動生成版本号。
詳細流程
若程式需要定義版本号,則可以将版本号記錄在程式集的AssemblyInfo.cs檔案中
[assembly: AssemblyVersion("1.0.0")][assembly: AssemblyFileVersion("1.0.0")]
也可以在程式集右鍵選擇屬性(或者通過快捷鍵Alt + Enter),在Application點選Assembly Infomation...按鈕修改程式集版本号和檔案版本号。

AssemblyVersion是程式集的版本,.NET的CLR用于辨別出該dll的版本資訊,用于定義強名稱的版本号,該版本号每一位最大為16位長度,即最大為65535,超過時編譯不通過。
AssemblyFileVersion是檔案版本号,僅僅是檔案版本号,給人看的,沒有實際什麼作用,也沒有長度限制。
擷取SVN Reversion
我們規定程式的版本号為需求版本号1.0.0加上SVN的Reversion做為修訂号。這樣就能直接關聯上該程式集是哪個版本的代碼。
關于修訂号,在《TortoiseSVN》文檔中有相關的說明。我看的是《TortoiseSVN 1.8.10》的文檔,在第五章介紹了SubWCRev程式。通過SubWCRev程式可以執行關鍵字$WCREV$替換。同時我們需要提供一個版本号模闆檔案,通過替換版本号模闆檔案的關鍵字生成我們需要的版本号檔案。
首先我們根據程式集下AssemblyInfo.cs檔案複制出一個AssemblyInfo.template.cs檔案。
由于我們僅僅是為了修改版本号資訊,後面就稱之為版本号模闆檔案。
然後将其[assembly: AssemblyFileVersion("1.0.0.0")]修改為[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]。這樣我們就可以通過SubWCRev程式替換修訂号。
由于AssemblyVersion有大小限制,不允許超過65535,而SVN修訂号很有可能會超過該值,是以CLR的程式集版本号不用改修訂号。隻需要修改檔案版本号即可。
由于在編譯時,VS會編譯AssemblyInfo檔案提取出程式集資訊放入到程式集内。我們直接複制出來的版本号模闆檔案預設也會進行編譯。而我們建立的版本号模闆檔案用于生成版本号檔案,無需編譯。我們需要的是通過版本号模闆檔案生成版本号檔案,即通過AssemblyInfo.template.cs生成AssemblyInfo.cs。是以在版本号模闆檔案右鍵屬性中将Build Action從Compile修改為None。
此時我們已經有了版本号模闆檔案,接下來要做的是在編譯的之前先根據版本号模闆檔案建立我們需要的版本号檔案。
VS編譯的時候提供了編譯前預處理功能和編譯後處理功能。在程式集屬性中,我們選擇Build Event裡面有Pre-build event command line,通過在裡面輸入指令可以實作在編譯前執行我們想要的指令。
同時VS内部也提供了一些宏指令供我們使用,通過點選Edit Pre-build按鈕,會彈出一個編輯框
點選Macros可以檢視所有VS支援的宏指令
SubWCRev程式指令格式為SubWCRev WorkingCopyPath [SrcVersionFile DstVersionFile] [-nmdfe],WorkingCopyPath為SVN的工作副本,SrcVersionFile為原始版本檔案,即版本模闆檔案。DstVersionFile為替換關鍵子後儲存的版本檔案。
在VS環境變量中我們可以通過$(ProjectDir)擷取到目前程式集路徑,通過$(SolutionDir)擷取到解決方案路徑。
宏指令為$(指令名)格式
在預編譯事件中輸入以下指令SubWCRev $(SolutionDir) $(ProjectDir)PropertiesAssemblyInfo.template.cs $(ProjectDir)PropertiesAssemblyInfo.cs即可在編譯前擷取到SVN的reversion填充到修訂号中。
編譯後可以在輸出視窗看到關鍵字替換的資訊
1>------ Build started: Project: FGMain, Configuration: Debug Any CPU ------1> SubWCRev: 'F:工作SVNPlatformrunkFGMainFGMain'1> Last committed at revision 1002681> Mixed revision range 100267:1002681> Local modifications found1> Unversioned items found
擷取需求号
在實際工作中,我們每次發版都會有一個需求版本号。當産生需求時整個版本都會使用這個版本号。是以我們可以在開發的時候就在開發分支上建立該版本号的需求分支。分支名稱以版本号命名,這樣程式就可以擷取到URL的版本号資訊填充到版本号模闆号模闆檔案中。而省去了人為修改版本号的麻煩。
比如目前版本号為1.32.0,則在SVN程式的分支上建立一個1.32.0的版本。branches/FGMain/1.32.0。
接下來在我們使用SubWCRev程式關鍵字替換之前需要先擷取到分支的版本号填充到版本号模闆檔案中。這樣在編譯前就會将版本号和SVN的修訂号一同生成。
我們還需要提前判斷目前SVN工作目錄是否有修改,隻有在工作目錄有修改時,才需要更新版本号,工作目錄沒有修改時,則無需修改版本号。
當我們安裝了SVN用戶端後(同時需要選擇安裝指令行工具),我們可以通過SVN執行執行指令,通過SVN help檢視支援的所有參數。
SVN用戶端安裝時需要勾選指令行工具,如下截圖
擷取版本号
我們需要擷取url的版本号。而版本号隻有在分支目錄上才有,是以我們可以通過正則解析以下url,提取版本号。若提取不到則無需執行後續邏輯
通過svn info擷取目前目錄的svn資訊,通過svn info 路徑擷取指定路徑的svn資訊。
F:工作SVNPlatformrunkFGMain>svn infoPath: .Working Copy Root Path: F:工作SVNPlatformrunkFGMainURL: http://inner.svn.com:81/ATS_Code/Platform/branches/FGMain/1.32.0Relative URL: ^/Platform/branches/FGMain/1.32.0Repository Root: http://inner.svn.com:81/ATS_CodeRepository UUID: 2fd9d0ce-2897-f849-b9e2-af1303b08de7Revision: 99512Node Kind: directorySchedule: normalLast Changed Author: wishLast Changed Rev: 99512Last Changed Date: 2019-06-14 17:54:47 +0800 (周五, 14 6月 2019)
指令會傳回多行資訊,我使用的時SVN 1.11 版本的用戶端,其他版本可能會有不同。我們解析第二行的URL進而解析出URL的版本号。
$svnInfo = svn info $projectDir$urlInfo = $svnInfo[2]$url = $urlInfo.Replace("URL: