• 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,我们会在固定的时间解决六个不同分支问题。

      版本冲突每天都会发生

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

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

     原文链接:

  • 相关阅读:
    基础架构:一条SQL查询语句是如何执行的?
    常用的字符串转换日期格式
    JSONObject.fromObject(map)(JSON与JAVA数据的转换)
    ModelAndView的介绍
    Springmvc常用注解
    @PathVariable注解
    @ModelAttribute运用详解
    struts2将servlet对象注入到Action中
    为什么要继承ActionSupport?
    mysql中like用法
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7116506.html
Copyright © 2020-2023  润新知