最好的 Xcode 自动生成版本号技术

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

的提交数。它一直正常工做着,但咱们的技术也不是一路顺风的。github

糟糕的老方法xcode

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

原谅的名字。它工做原理以下:app

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

      是什么并不重要。工具

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

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

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

      让它做为预处理变量 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,咱们会在固定的时间解决六个不一样分支问题。版本号冲突天天都会发生

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

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

 

 
 原文连接:
相关文章
相关标签/搜索