zoukankan      html  css  js  c++  java
  • Xcode 自己主动生成版本技术最佳实践

    bloglovin ,我们使用自己主动生成版本来设置Xcode,使当前的版本为在Git活跃的分支上

    的提交数。

    它一直正常工作着。但我们的技术也不是一帆风顺的。

    糟糕的老方法

    我们使用的技术是来自一个叫 “Cocoa is my Girlfriend”1 的网友发表的一篇文章,真是个不可

    原谅的名字。

    它工作原理例如以下:

      1. 执行一个脚本拿到Git提交数并把它输出到一个 “infoplistwhatever.h” 文件里.这个文件名

          是什么并不重要。

      2. 在Xcode中选择 Target 中的 build Setting,在Packaging 设置支持 “Preprocess Info.plist

          File” 。并设置 “Info.plist Preprocessor Prefix File” 的值为Step1:中的文件名称。

      3. 在Setp1中的 "infoplistwhatever.h“ 文件得到的git提交数的值或者能达到这效果的其它值,

          让它作为预处理变量 custom_build_number 的值。

      4. 在Xcode 的 Info.plist 中使用 custom_build_number 替换如今的版本。

    尽管这样的技术能够正常工作,但它有几个很令人讨厌的缺点:

      1. 每次提交改变数目后的生成都会弄脏Git。

      2. 假设你不想弄脏Git。你必须忽略 “Preprocess Info.plist File” 。


      3. 假设你忽略了预处理器的plist文件,你必须手动创建的一个初始化文件,否则在

        Xcode上第一次生成将会失败(除非你不把你的 ”.gitignore“ 文件提交到Git 仓库上,

          让原始值继续跟踪文件如今的状态)。

      4. 版本将不会更新,除非您手动清理和重建。这是由于在Xcode 用一种不可能被其

          它机制清理的方式缓存了 Info.plist 。在这周围我也尝试了非常多:生成预动作方案,

          其他的执行脚本等。也没有想到其他的方式,仅仅有手动清理和又一次生成,同一时候也失去了

         自己主动设置的目的。

    最可行的方法

    经过大量的谷歌搜索,我搜到一篇文章的匿名评论,并且评论中提到的技术表现更好些。

    避免了我们之前的技术全部的缺陷。并且更easy设置。你须要做的就是支持该技术,在

    ”build phase“ 的 “Copy Bundle Resources” 后面添一个 "run script" 脚本。

     脚本代码:

    复制代码
    #
    # Set the build number to the current git commit count.
    # If we're using the Dev scheme, then we'll suffix the build
    # number with the current branch name, to make collisions
    # far less likely across feature branches.
    # Based on: http://w3facility.info/question/how-do-i-force-xcode-to-rebuild-the-info-plist-file-in-my-project-every-time-i-build-the-project/
    #
    git=`sh /etc/profile; which git`
    appBuild=`"$git" rev-list --all |wc -l`
    if [ $CONFIGURATION = "Debug" ]; then
    branchName=`"$git" rev-parse --abbrev-ref HEAD`
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $appBuild-$branchName" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
    else
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $appBuild" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
    fi
    echo "Updated ${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
    复制代码

    这个脚本使用 PlistBuddy 命令行工具来编辑 /foo/DerivedData/bar(也是Target的生成文件夹)

    文件夹下的 Info.plist 的版本。这就是为什么版本变化时Git不会被弄脏。每次生成它都会更

    新了版本。不仅仅是一个总的清理后的第一次生成。并且和你是否在 Info.plist 页面也没有关系。

    上面的代码是在匿名评论者代码上做了一些改动。

    它使用Git提交计数的版本。可是假设它检測

    到我们在Xcode使用调试生成配置,它会在版本后加上当前分支的名字后缀。

    这避免了在并行

    开发中不同分支版本潜在的冲突2

    2014年9月14日-更新Johan库尔,能够说是在互联网上最酷的名字。他纠正了我的新执行脚本

    的一些潜在的问题。上面的脚本也已经更新。


    1. 严格来说,在2014就改名字了.

    2. 在Bloglovin,我们会在固定的时间解决六个不同分支问题。

      版本冲突每天都会发生

              尽管不是一个大的问题。我不喜欢这个特定的生成,这将会导致难以识别的崩溃日志。

              这样的在版本后面加后缀的方法应该能够解决问题。

     原文链接:

  • 相关阅读:
    hdu 2485 Destroying the bus stations 迭代加深搜索
    hdu 2487 Ugly Windows 模拟
    hdu 2492 Ping pong 线段树
    hdu 1059 Dividing 多重背包
    hdu 3315 My Brute 费用流,费用最小且代价最小
    第四天 下载网络图片显示
    第三天 单元测试和数据库操作
    第二天 布局文件
    第一天 安卓简介
    Android 获取存储空间
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7116506.html
Copyright © 2011-2022 走看看