自己主动化的在程序中显示SVN版本号

有时候会有这种情况,策划拿着应用过来提一个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

时间: 2024-12-28 11:59:46

自己主动化的在程序中显示SVN版本号的相关文章

自动化的在程序中显示SVN版本

有时候会有这样的情况,策划拿着应用过来提一个bug,但我们却不好确定策划的手机上装的应用对应的是那个代码版本. 为了解决这个问题,我们希望能在应用上显示出当前应用所对应的代码版本,即svn版本. 构想了下,希望最后达到的效果有: 自动化,不需要每次编译版本的时候有人为的步骤,比如编版本的时候人为修改某个值或者点击某个脚本. 跨平台,对外发布的win32/iOS/Android版本都能正确表现 全面性,无论用Windows上用vs开发/Mac OS上用XCode/Eclipse来进行开发,无论是D

Android Gradle实用技巧——APK文件名中加上SVN版本号,日期等

有时候,我们会希望能把APK文件名上带上打包日期,打包时svn的版本号,应用版本号等.当然这些也可以手动添加,但是手动的话也未免太不优雅了,而且可能会出错. 利用Gradle,我们可以让打包出来的apk自动的带上一些列信息. 默认读者已经对gradle有一定的了解,有buildtypes,productFlavors的概念.不了解的可以看看上一篇或者去网上搜索来补充一下. Gradle是基于groovy的自动化构建工具,在build.gradle中我们可以用一些脚本,函数来控制编译的过程.本文所

自己主动化測试程序之中的一个自己定义键盘的模拟測试程序(C语言)

一.測试程序编写说明 我们做的终端设备上运行的是QT应用程序.使用自己定义的键盘接口.经过測试人员长时间的人机交互測试,来确认系统的功能是否满足需求. 如今须要编写一个自己主动化的測试程序,能够依照预设的脚本运行,比方某个按键须要连续运行10000次.或是通过连续几个按键动作运行特定的业务流程10W次.通过这种自己主动測试,能够减轻測试人员的负担,还能够查看触发N次按键后,画面运行N次后的系统的稳定性,如内存使用率,cup使用率等等. 设备有4*4的键盘,包含0-9,C(Call).A.U(up

在Win32程序中显示Dos调试窗口,可暂停(AllocConsole,WriteConsole,FreeConsole函数,GetStdHandle函数取得输入句柄)

在很多程序中,都可以看到程序运行中,会有一个Dos窗口,实时显示一些运行信息,这里就告诉大家是如何实现的,我们做个简单的,其实对控制台的操作还有很多,有兴趣的可以去查资料. 用到的API函数如下: //创建控制台 AllocConsole; //获取控制台窗口 GetStdHandle; //向控制台输出信息 WriteConsole; //释放控制台 FreeConsole; unit Unit1; interface uses Windows, Messages, SysUtils, Var

微信小程序中显示与隐藏(hidden)

1.wx.wxml页面部分 <view bindtap='click'>点击</view> //这是显示隐藏的部分 <view hidden="{{hiddenName}}">隐藏显示部分</view> 2.wx.js js部分 page({ data:{ hiddenName:true }, click:function(e){ this.setData({ hiddenName:!this.data.hiddenName }) } }

myeclipse中代码不显示SVN版本号

问题: 首先我是把SVN上的代码checkout到我本地了(d:\svn),然后我在myeclipse中导入d:\svn里的项目,但在myeclipse中不显示代码的版本号. 解决: windows ->preferences->General->Appearance->Lable Decoration s  勾选其中的 SVN 项即可. ps:小乌龟的版本必须和服务器上svn服务器的版本一直,否则先删除所有的.svn文件夹,然后share一下选择相同的目录分享上去,svn会重新c

VC实现A进程窗口嵌入到B进程窗口中显示的方法

这篇文章主要介绍了VC实现A进程窗口嵌入到B进程窗口中显示的方法,对于理解windows程序运行原理的进程问题有一定的帮助,需要的朋友可以参考下 本文通过一个Demo示例讲述把A应用程序嵌入到B应用程序中显示的方法. 主要代码如下: <span style="font-size:12px;font-weight: normal;">//在B应用启动时创建A进程 CreateProcess(_T("A.exe"),NULL,NULL,NULL,FALSE,

Windows环境下Python v2.7.9,NotePad++编写程序中涉及中文,执行时CMD中显示乱码的解决办法

例如: 1.使用NotePad++,以默认的"以 UTF-8无 BOM 格式编码"编写: print "一加一等于二" 直接运行后CMD报错: 但是在IDLE中显示正常: 在文件第一行加入注释: # _*_coding:utf-8_*_ 运行后CMD显示乱码,IDLE依然正常: 在字符串前加u(Unicode编码): # _*_coding:utf-8_*_ print u"一加一等于二" 运行后正常,IDLE依然正常: 2. 使用NotePad

在程序中点击home键后将程序通知显示到状态栏中

当程序处于后台运作的时候,Activity处于onStop状态,so只要在onStop方法中将程序运行状态显示在状态栏即可 //在状态栏显示程序通知    private void showNotification() {        // 创建一个NotificationManager的引用        NotificationManager notificationManager = (NotificationManager) this                .getSystem