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 。在这周围我也尝试了很多:生成预动作方案,

          其他的运行脚本等。也没有想到其它的方式,只有手动清理和重新生成,同时也失去了

         自动设置的目的。

    最可行的方法

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

    避免了我们之前的技术所有的缺陷,而且更容易设置。你需要做的就是支持该技术,在

    ”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,我们会在固定的时间解决六个不同分支问题。版本号冲突每天都会发生

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

              这种在版本号后面加后缀的方法应该可以解决这个问题。

     
     原文链接:
     
     
     
     
     
  • 相关阅读:
    BestCoder17 1001.Chessboard(hdu 5100) 解题报告
    codeforces 485A.Factory 解题报告
    codeforces 485B Valuable Resources 解题报告
    BestCoder16 1002.Revenge of LIS II(hdu 5087) 解题报告
    codeforces 374A Inna and Pink Pony 解题报告
    codeforces 483B Friends and Presents 解题报告
    BestCoder15 1002.Instruction(hdu 5083) 解题报告
    codeforces 483C.Diverse Permutation 解题报告
    codeforces 483A. Counterexample 解题报告
    NSArray中地内存管理 理解
  • 原文地址:https://www.cnblogs.com/skyming/p/3978424.html
Copyright © 2011-2022 走看看