開發日記:在VS項目中使用SVN版本號做爲編譯版本號

在實際項目中(特別是做爲產品的項目),版本號是必不可少的一部分。版本號的規則也有許多種,在此不討論具體的編碼規範。對於迭代的產品,版本繁多,特別是有多個實施項目所使用產品的版本不一樣(基於定製需求)時,清楚的標識組件與代碼的對應關係十分重要。html

本文主要說明如何在 .Net 項目使用 SVN 做爲版本控制工具時生成與代碼對應的組件版本號。ide

咱們知道,SVN 在 commit 時會生成一串數字做爲序號,因此基本思路是把這個序號做爲 . Net 項目編譯後生成dll的文件版本號的最後一段。下面所列方法須要使用到TortoiseSVN 提供的 SubWCRev.exe 。svn

首先,咱們須要經過註冊表查找 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.exeui

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

SubWCRev 是經過替換文件中指定的關鍵字來實現得到 commit 序號的,點擊查看詳細的列表。 編碼

而後咱們創建以一個 AssemblyInfo.tpl 做爲替換使用的模板,因爲 AssemblyInfo.cs 中除了固定的值外還有相似 GUID 變化的值,因此咱們不能所有替換,所以僅將須要修改的部分放在 tpl 中,內容以下:spa

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

 接下來使用批處理替換原來的 AssemblyInfo.cs 文件,爲了在每次編譯時都自動替換,咱們把調用批處理的命令寫在項目生成事件的生成前事件中,例以下面這樣:.net

"(TargetDir)BeforeBuildProject.bat""(TargetDir)BeforeBuildProject.bat""(ProjectDir)" "$(TargetDir)AssemblyInfo.tpl" .\Properties\AssemblyInfo.cs版本控制

$(TargetDir)表示編譯輸出目錄,更多可用全局變量請在生成事件中點擊「宏」查看。code

 替換 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


複製代碼
 1 SET WorkDir=%1
 2 SET Template=%2
 3 SET target=%3
 4 SET AssemblyInfo=ASSEMBLY_INFO.tmp
 5 
 6 PushD %WorkDir%
 7 SET WorkDir=.\
 8 
 9 Rem Generate a template file
10 FindStr /v "AssemblyVersion AssemblyFileVersion" %target% > %AssemblyInfo%
11 FindStr ".*" %Template% >> %AssemblyInfo%
12 
13 Rem Using TSVN Replace Tlp
14 "%TSVN_PATH%" %WorkDir% %AssemblyInfo% %target%>NUL
複製代碼

 固然這樣還不是一勞永逸,你會發現每次編譯 AssemblyInfo.cs 文件都會變化,所以你的 commit 序號也會一直跟着增長,這並非咱們所想要的效果。這裏提出一種解決方案,在每次替換後生成 dll 後又將 AssemblyInfo.cs 還原回去。

爲此,咱們在生成前事件中增長備份命令:

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

而後增長生成後事件,調用命令爲:

"(TargetDir)AfterBuildProject.bat""(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 的文件版本中了。

完整代碼下載:點擊下載

本文來自 NewIdea 的博客,做者 Carey Tzou 。

原文地址:http://www.cnblogs.com/NewIdea/p/AutoVersion.html

相關文章
相關標籤/搜索