1. 程式人生 > >自己主動化的在程序中顯示SVN版本號

自己主動化的在程序中顯示SVN版本號

hang info popu -m for android alt 2dx 平臺

有時候會有這種情況,策劃拿著應用過來提一個bug,但我們卻不好確定策劃的手機上裝的應用相應的是那個代碼版本號。

為了解決問題。我們希望能在應用上顯示出當前應用所相應的代碼版本號,即svn版本號。



構想了下,希望最後達到的效果有:

自己主動化,不須要每次編譯版本號的時候有人為的步驟,比方編版本號的時候人為改動某個值或者點擊某個腳本。


跨平臺。對外公布的win32/iOS/Android版本號都能正確表現
全面性。不管用Windows上用vs開發/Mac OS上用XCode/Eclipse來進行開發,不管是Debug調試時還是公布各種平臺包時,都能顯示當前使用的代碼版本號。

思路例如以下

1. svn版本號的自己主動取得和存儲:

在svn管理的代碼文件夾下執行svn info。能夠看到一系列信息,當中和版本號信息有關的有兩個:Revision和Last Changed Rev。
Revision是本地的版本,Last Changed Rev是限定在選定當前文件夾下的改動版本。

依據須要。這裏選擇取用Last Changed Rev
用腳本能夠取得版本數據,並保存在程序能夠取用到的文件夾。



2. 自己主動化:

能夠通過各種IDE的build event來做。也能夠通過svnclient的某些功能。比方TortoiseSVN的Hook scripts[1]。但實際使用發現:

1). TortoiseSVN的Hook scripts 假設在頂層文件夾update,不會觸發內部源代碼文件夾的update Hook。
2). Mac上的Versions未發現類似功能

且我不希望這個版本數據文件被放到svn來管理。於是決定用各個IDE的編譯事件。

a. VS的設置方法如圖: VS_Setting.png

技術分享


PreBuildScript.bat


@echo off
set src_dir=%~dp0..
echo %src_dir%
set keyword="Last Changed Rev"
for /f "delims=" %%i in (‘svn info %src_dir% ^| findstr /C:%keyword%‘) do set rev=%%i
echo %rev%
set rev=%rev:~18%
@echo on
echo %rev% > %src_dir%/CMWar_2dx/Resources/gen/Rev.gen




b. XCode的設置,能夠使用Build > Pre-actions[2],但發現假設在Build裏面設置。在直接點Run調試的時候不運行,設置多個地方感覺非常不優雅,終於決定在Build Phases中設置

設置方法參考鏈接[3]中加入腳本一節。特別註意,"Run Script 欄,將其移動到列表的第二個位置"。這個決定了腳本運行的時機是在編譯前還是編譯後。



XCodePreBuildScript.sh

#XCodePreBuildScript.sh
#Ruoqian, Chen<[email protected]> 
#2014/7/25

path=$(dirname $0)

#gen rev
src_dir=$path/../CMWar_2dx
echo src_dir $src_dir
rev=`svn info $src_dir | awk -F ‘:‘ ‘{ if($1 ~ /^Last Changed Rev$/) {print $2} }‘ | tr -d " "`

res_dir=$src_dir/CMWar_2dx/Resources/
echo rev $rev
echo $rev > $res_dir/gen/Rev.gen

#for xcode update bug
#find $res_dir -type d -exec touch -cm {} \;
touch -cm $res_dir/ini $res_dir/gen $res_dir/script

c. Eclipse版本號,因為項目是2dx的遊戲,Builder中調用了build_native.sh來運行編譯,在合適的地方增加下面代碼就好

GEN_PATH="$APP_ANDROID_ROOT"/assets/gen

if [ ! -d "$GEN_PATH" ]; then
    mkdir "$GEN_PATH"
fi

version=`svn info ../../CMWar_2dx | awk -F ‘:‘ ‘{ if($1 ~ /^Last Changed Rev$/) {print $2} }‘ | tr -d " "`
echo $version > "$GEN_PATH"/Rev.gen



3. 因為各IDE編譯前將版本號信息寫入了Rev.gen。程序中僅僅須要讀取Rev.gen的數據並顯示就好了。

這樣就達到了自己主動化顯示當前代碼版本號號的目的。但SVN發生Update等操作時候。代碼文件夾的Last Changed Rev會隨之變化,編

譯後Rev.gen自然會隨之變化,達到了自己主動化變更的目的。




其它細節:

a) 之所以須要加一級目錄gen,主要原因是為了XCode打包不認不在project中管理的文件或目錄。而Rev.gen我們並不希望進入版本號庫。僅僅好加在XCodeproject中增加一個引用型的目錄gen,並把目錄本身納入版本號管理

b) XCode5以後的打包優化策略[2][3],使得我們須要touch一下,才幹使得最新生成的Rev.gen被打包進版本號

c) 因為合作開發人員有可能誤將Rev.gen上傳,將Rev.gen的忽略設置提交到SVN能夠避免此問題

d) 因為編譯後會在本地產生相應代碼版本號的Rev.gen信息。能夠利用這裏的信息。對照SVN版本號,來推斷當前代碼版本號是否被編譯過,即能夠用來實現自己主動公布Release腳本中的檢查。



set /p build_ver= < ..\..\CMWar_2dx\CMWar_2dx\Resources\gen\Rev.gen

if not "%rev%"=="%build_ver%" (
    echo "Build Ver != rev"
    pause
    exit
)



本文的txt版本號和文中涉及的腳本文件均已打包上傳到 http://download.csdn.net/detail/piao_polar/7678339

參:
[1] http://www.cnblogs.com/loongwong/archive/2012/07/13/2590927.html
[2] http://blog.mutoo.im/2013/12/xcode-5-does-not-copy-bundle-resources-in-folder.html
[3] http://quick.cocos.org/?

p=22


自己主動化的在程序中顯示SVN版本號