1. 程式人生 > >在VS專案中使用SVN版本號作為編譯版本號

在VS專案中使用SVN版本號作為編譯版本號

在生產專案中,版本號是必不可少的一部分。版本號的規則也有許多種,在此不討論具體的編碼規範。對於迭代的產品,版本繁多,特別是有多個實施專案所使用產品的版本不同(基於定製需求)時,清楚的標識元件與程式碼的對應關係十分重要。 本文主要說明如何在 .Net 專案使用 SVN 作為版本控制工具時生成與程式碼對應的元件版本號。

我們知道,SVN 在 commit 時會生成一串數字作為序號,所以基本思路是把這個序號作為 .Net 專案編譯後生成dll的檔案版本號的最後一段。下面所列方法需要使用到TortoiseSVN 提供的 SubWCRev.exe 。

首先,我們需要通過登錄檔查詢 TortoiseSVN 的安裝目錄。

Rem Search TSVN Path
For /f "tokens=*" %%i In ('Reg Query HKLM\Software\TortoiseSVN /v Directory') Do (
   ECHO %%i | Find "Directory">NUL
   IF %ERRORLEVEL% == 0 (For /f "tokens=1,2,*" %%j In ("%%i") Do (SET TSVN_PATH=%%1))
)
SET TSVN_PATH=%TSVN_PATH%bin\SubWCRev.exe

SubWCRev 是通過替換檔案中指定的關鍵字來實現獲得 commit 序號的,點選檢視詳細的列表。

然後我們建立以一個 AssemblyInfo.tpl 作為替換使用的模板,由於 AssemblyInfo.cs 中除了固定的值外還有類似 GUID 變化的值,所以我們不能全部替換,因此僅將需要修改的部分放在 tpl 中,內容如下:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]

接下來使用批處理替換原來的 AssemblyInfo.cs 檔案,為了在每次編譯時都自動替換,我們把呼叫批處理的命令寫在專案生成事件的生成前事件中,例如下面這樣:

"(TargetDir)BeforeBuildProject.bat""(ProjectDir)" "$(TargetDir)AssemblyInfo.tpl" .\Properties\AssemblyInfo.cs

$(TargetDir)表示編譯輸出目錄,更多可用全域性變數請在生成事件中點選“巨集”檢視。

替換 AssemblyInfo.cs 的批處理程式碼:

SET WorkDir=%1
SET Template=%2
SET target=%3
SET AssemblyInfo=ASSEMBLY_INFO.tmp

PushD %WorkDir%
SET WorkDir=.\

Rem Generate a template file
FindStr /v "AssemblyVersion AssemblyFileVersion" %target% > %AssemblyInfo%
FindStr ".*" %Template% >> %AssemblyInfo%

Rem Using TSVN Replace Tlp
"%TSVN_PATH%" %WorkDir% %AssemblyInfo% %target%>NUL

當然這樣還不是一勞永逸,你會發現每次編譯 AssemblyInfo.cs 檔案都會變化,因此你的 commit 序號也會一直跟著增加,這並不是我們所想要的效果。這裡提出一種解決方案,在每次替換後生成 dll 後又將 AssemblyInfo.cs 還原回去。

為此,我們在生成前事件中增加備份命令:

COPY /y "%target%" "%target%.bak">NUL

然後增加生成後事件,呼叫命令為:

"(TargetDir)AfterBuildProject.bat""(ProjectDir)Properties\AssemblyInfo.cs"

在 AfterBuildProject.bat 中我們需要完成還原 AssemblyInfo.cs 和刪除備份檔案的工作,程式碼如下:

SET target=%1
COPY "%target%.bak" %target%
DEL /Q "%target%.bak" 2>NUL

就此,每次編譯時,系統都會自動將 commit 序號放到 dll 的檔案版本中了。

完整程式碼下載:點選下載

本文來自 The NewIdea,作者 Carey Tzou 。

未經授權,拒絕任何全文及摘要轉載!(本部落格由作者本人維護,已授權在CSDN上同步釋出)

歡迎關注微信公眾號:CareyTzou(dotNet大資料)

Wechat:CareyTzou