【PE】利用SVN的SubWCRev.exe管理同步專案的版本號

yousss發表於2018-09-05

### Date: 2017/3/18

###Author: SoaringLee

參考:http://blog.csdn.net/listener51/article/details/53199086

一、Windows平臺

關於subwcrev.exe參見: 
http://tortoisesvn.net/docs/nightly/TortoiseSVN_zh_CN/tsvn-subwcrev.html 
http://tortoisesvn.net/docs/nightly/TortoiseSVN_zh_CN/tsvn-subwcrev-keywords.html

基本格式是: 
SubWCRev WorkingCopyPath [SrcVersionFile DstVersionFile] [-nmdfe]

所以需要在VS對應的工程中新建兩個檔案,一個是SrcVersionFile和DstVersionFile,其中: 

 


 
  1. 1.WorkingCopyPath工程所在的目錄

  2. 2.SrcVersionFile含有SubWCRev.exe程式可以替換的巨集;

  3. 3.DstVersionFile為更新svn之後把巨集替換掉以後的目標檔案。

例如: 
SrcVersionFile為一個標頭檔案,名字叫Template.Source.Version.h,其內容如下:

 

 


 
  1. #pragma once

  2.  
  3. #define VER_UMS_HQ_MAJOR 2

  4. #define VER_UMS_HQ_MINOR 2

  5. #define VER_UMS_HQ_SVN $WCREV$

  6.  
  7. #define VER_UMS_HQ_REVISION "2.2.$WCREV$.0"

 

DstVersionFile檔案為另外一個標頭檔案,名字叫Source.Version.h,其內容如下:

 


 
  1. #pragma once

  2.  
  3. #define VER_UMS_HQ_MAJOR 2

  4. #define VER_UMS_HQ_MINOR 2

  5. #define VER_UMS_HQ_SVN 8465

  6.  
  7. #define VER_UMS_HQ_REVISION "2.2.8465.0"

 

然後在工程屬性設定: 

Build Event選項->Pre-Build Event的Command Line中輸入: 
subwcrev.exe “./” “./Template.Source.Version.h” “./Source.Version.h”

這樣每次用svn更新程式碼時,svn的專案版本號也更新下來了,並最終替換掉 Template.Source.Version.h中巨集$WCREV$,生成Source.Version.h中的內容。

 

TortoiseSVN下有一個SubWCRev程式,可以獲取任意個路徑對應的SVN版本庫的版本號。並替換到檔案對應位置。

VC2010的資原始檔可以控制生成的二進位制檔案版本號。

可以利用VC2010的生成前命令,呼叫SubWCRev來獲取最新的SVN版本號並寫入生成的二進位制檔案中。

程式也可以判斷呼叫的DLL版本號是否比本身大。以控制不會呼叫不對應的動態庫。可以使依賴多了一層執行時保證。

實現該目的,需要

  • 每次編譯前,從svn獲取當前版本庫的版本號,並寫入資原始檔
  • 編譯完成後,打安裝包時,讀取版本資訊

需要注意兩點:

1,svn的工具可獲取版本號並更新到專案檔案

 如果提供了原始檔和目的檔案,SubWCRev 會複製原始檔到目標檔案,執行如下所屬的關鍵字替換:

 

關鍵字 描述
$WCREV$ 工作副本中最高的提交版本來替換
$WCDATE$ 用最高提交版本的日期/時間替換。預設使用國際化格式:yyyy-mm-dd hh:mm:ss。作為選擇,你可以指定strftime()使用自定義格式,例如:$WCDATE=%a %b %d %I:%M:%S %p$。格式字元的列表參見線上引用
$WCNOW$ Replaced with the current system date/time. This can be used to indicate the build time. Time formatting can be used as described for$WCDATE$.
$WCRANGE$ 在工作目錄用更新版本範圍替換。如果工作目錄處於一致的狀態,它是一個單一版本。如果工作目錄包含混合版本,或者是過時,或者是故意更新到版本,那麼這個範圍會用象100:200這樣的格式來顯示。
$WCMIXED$ 當有混合版本時用TText替換$WCMIXED?TText:FText$,否則用FText替換。
$WCMODS$ 若本地存在修改,就用TText替換$WCMODS?TText:FText$,否則用FText替換。
$WCURL$ 用傳遞給SubWCRev的工作目錄的版本庫地址替換。
$WCINSVN$ $WCINSVN?TText:FText$is replaced withTTextif the entry is versioned, orFTextif not.
$WCNEEDSLOCK$ $WCNEEDSLOCK?TText:FText$is replaced withTTextif the entry has thesvn:needs-lockproperty set, orFTextif not.
$WCISLOCKED$ $WCISLOCKED?TText:FText$is replaced withTTextif the entry is locked, orFTextif not.
$WCLOCKDATE$ Replaced with the lock date. Time formatting can be used as described for$WCDATE$.
$WCLOCKOWNER$ Replaced with the name of the lock owner.
$WCLOCKCOMMENT$ Replaced with the comment of the lock.

 

2、SubWCRev.exe從命令列或指令碼中執行,使用命令列引數控制。

SubWCRev WorkingCopyPath [SrcVersionFile DstVersionFile] [-nmdfe]

WorkingCopyPath是要檢查的工作副本路徑,你可以只對工作副本使用SubWCRev,而不是直接對版本庫,這個路徑可以是絕對路徑,也可以是工作目錄的相對路徑。

如果你想讓SubWCRev執行關鍵字替換,象版本庫版本,地址等欄位儲存到文字檔案,就需要提供一個模版檔案SrcVersionFile,輸出檔案DstVersionFile就是模版替換之後的版本。

有幾個開關影響 SubWCRev工作。如果使用多個,必須用單個組指定,例如要用-nm,不能用-n -m

 

表 5.2. 列出可用的命令列開關

切換 描述
-n If this switch is given, SubWCRev will exit withERRORLEVEL 7if the working copy contains local modifications. This may be used to prevent building with uncommitted changes present.
-m If this switch is given, SubWCRev will exit withERRORLEVEL 8if the working copy contains mixed revisions. This may be used to prevent building with a partially updated working copy.
-d If this switch is given, SubWCRev will exit withERRORLEVEL 9if the destination file already exists.
-f 如果給出這個開關,SubWCRev 就會包含資料夾的最後修改版本。預設行為是取得版本號時只考慮檔案。
-e If this switch is given, SubWCRev will examine directories which are included withsvn:externals, but only if they are from the same repository. The default behaviour is to ignore externals.
-x If this switch is given, SubWCRev will output the revision numbers in HEX.
-X If this switch is given, SubWCRev will output the revision numbers in HEX, with '0X' prepended.

 

二、Linux平臺

       Linux平臺下可以通過Subversion或者svn info生成定義,命令如下:

$(shell subversion -n|grep [0-9]*[A-M])

$(shell svn info|grep Revision|awk 'print $2’)

相關文章