自己主动化的在程序中显示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<piao.polar@gmail.com>
#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版本号的更多相关文章
- 微信小程序中显示html富文本的方法
微信小程序中显示html富文本的方法 使用方法:git地址:https://github.com/icindy/wxParse 一.下载wxParse文件 二.在要引入的页面的js文件中,引入文件 j ...
- Android Gradle实用技巧——APK文件名中加上SVN版本号,日期等
有时候,我们会希望能把APK文件名上带上打包日期,打包时svn的版本号,应用版本号等.当然这些也可以手动添加,但是手动的话也未免太不优雅了,而且可能会出错. 利用Gradle,我们可以让打包出来的ap ...
- 自己主动化測试程序之中的一个自己定义键盘的模拟測试程序(C语言)
一.測试程序编写说明 我们做的终端设备上运行的是QT应用程序.使用自己定义的键盘接口.经过測试人员长时间的人机交互測试,来确认系统的功能是否满足需求. 如今须要编写一个自己主动化的測试程序,能够依照预 ...
- 在Win32程序中显示Dos调试窗口,可暂停(AllocConsole,WriteConsole,FreeConsole函数,GetStdHandle函数取得输入句柄)
在很多程序中,都可以看到程序运行中,会有一个Dos窗口,实时显示一些运行信息,这里就告诉大家是如何实现的,我们做个简单的,其实对控制台的操作还有很多,有兴趣的可以去查资料. 用到的API函数如下: / ...
- 在Win32程序中显示Dos调试窗口
在很多程序中,都可以看到程序运行中,会有一个Dos窗口,实时显示一些运行信息,这里就告诉大家是如何实现的,我们做个简单的,其实对控制台的操作还有很多,有兴趣的可以去查资料. 用到的API函数如下: / ...
- 如何在服务(Service)程序中显示对话框
原文:http://www.vckbase.com/index.php/wv/94 服务程序(Service)一般是不能和用户进行交互的,所以他一般是不能显示窗口的.要和用户进行交互(如显示窗口),我 ...
- 微信小程序中显示与隐藏(hidden)
1.wx.wxml页面部分 <view bindtap='click'>点击</view> //这是显示隐藏的部分 <view hidden="{{hidden ...
- C#在Winform程序中显示QQ在线状态
首先,引入必要的命名空间 using System.Windows.Forms; using System.Net; 其次,在Form中拖入一个PictureBox控件,并设置其SizeMode为A ...
- QT程序中显示中文字体解决办法
Qt4.7.1 默认没有中文字体库,迅为给用户提供“文泉驿”字体和配置方法.本节需要的 文件在网盘: 用一个简单测试程序说明“文泉驿”字体的配置方法. 在 Qt Creater 新建工程“nihao” ...
随机推荐
- 此文章介绍vue-cli脚手架config目录下index.js配置文件
此配置文件是用来定义开发环境和生产环境中所需要的参数 关于注释 当涉及到较复杂的解释我将通过标识的方式(如(1))将解释写到单独的注释模块,请自行查看 上代码 // see http://vuejs- ...
- TopK代码
Hash表 #ifndef _HASH_H #define _HASH_H #include<string.h> #include<stdio.h> class HashTab ...
- 常用MIME类型(Flv,Mp4的mime类型设置)
也许你会在纳闷,为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢?这就表明mp4格式文件是服务器无法识别的,其实,这是没有在iis中 ...
- C#微信公众号的开发——服务配置
最近因为需要用C#开发微信公众号的一些功能,记录一下开发公众号的一些坑..... 首先先介绍一下,微信公众号的官方文档.虽然这个文档我感觉比较糙,但是还是可以借鉴一下让我们摸着石头过河的. 首先我们得 ...
- Shiny学习实践01
Shiny是什么东东? 官方描述: Shiny is an R package that makes it easy to build interactive web apps straight fr ...
- 复习java基础第六天(IO)
一:File 类 • 输入:读取外部数据(磁盘.光盘等存储设备的数据)到程序(内存)中. • 输出:将程序(内存)数据输出到磁盘.光盘等存储设备中 • Java 的 IO 流主要包括输入.输出两种 ...
- VHDL之concurrent之operators
Using operators Operators can be used to implement any combinational circuit. However, as will becom ...
- SQL Server存储过程作业(二)
阶段1:练习——统计某类型客房的入住客人人数 需求说明 使用存储过程统计在指定类型的客房入住客人的总人数 提示: 存储过程的输入参数是指定的客房类型名称 USE Hotel GO --阶段1:查询入住 ...
- dubbo之事件通知
事件通知 在调用之前.调用之后.出现异常时,会触发 oninvoke.onreturn.onthrow 三个事件,可以配置当事件发生时,通知哪个类的哪个方法 1. 服务提供者与消费者共享服务接口 in ...
- session 存入redis 或 memcache 的方法
Session简介 session,中文经常翻译为会话,其本来的含义是 指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session.有时候我们 ...