• 自己主动化的在程序中显示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_2dxCMWar_2dxResourcesgenRev.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
        
           

  • 相关阅读:
    土豆网自动播放代码
    js倒计时小插件(兼容大部分浏览器)
    带按钮的网页播放器代码(附文件)
    列出目录下所有文件
    day19 进度条 & 随机验证码
    day18 json与pickle
    day14.2_三元表达式、列表生成式
    day14.1_生成器
    day13_迭代器
    day12.2_完善装饰器
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6883865.html
Copyright © 2020-2023  润新知