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

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

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

 
 原文链接:
 
 
 
 
 

最好的 Xcode 自动生成版本号技术的更多相关文章

  1. Jenkins持续部署-自动生成版本号

    目录 Jenkins持续部署-自动生成版本号 目录 前言 目的 详细流程 获取SVN Reversion 获取需求号 设置编译前读取版本号 总结 参考文献 Jenkins持续部署-自动生成版本号 目录 ...

  2. 2018-8-10-VisualStudio-2017-项目格式-自动生成版本号

    title author date CreateTime categories VisualStudio 2017 项目格式 自动生成版本号 lindexi 2018-08-10 19:16:52 + ...

  3. 使用私有gitlab发布自动生成版本号和标签(version和tag)(骚)

    设置 semantic ,自动生成版本号和标签 FROM node:14-buster-slim LABEL maintainer="wangyunpeng" COPY sourc ...

  4. 修改AssemblyInfo.cs自动生成版本号

    一. 版本号自动生成方法 1.把 AssemblyInfo.cs文件中的[assembly:AssemblyVersion("1.0.0.0")]改成[assembly:Assem ...

  5. .net 程序集自动生成版本号

    一. 版本号自动生成方法 只需把 AssemblyInfo.cs文件中的 [assembly:AssemblyVersion("1.0.0.0")]改成 [assembly:Ass ...

  6. SVN自动生成版本号信息

        在平时的多版本开发过程中,需要通过版本号来定位到源码版本,便于定位问题.常规工程实践是设置版本号为X.Y.Z.N,一般X表示主版本号,Y表示子版本号,我一般将Z设为0,N为本次提交的SVN版本 ...

  7. [转载].net程序集自动生成版本号

    原文:http://hi.baidu.com/bcbgrand/item/a74a7ba71c3b0ea928ce9dce .net程序版本号的格式是4个十进制数字 比如 2.5.729.2 依次是 ...

  8. 设置 Xcode 自动生成代码片段

    一.什么是代码片段 当在Xcode中输入dowhile并回车后,Xcode会出现下图所示的提示代码: 这就是代码片段,目的是使程序员以最快的速度输入常用的代码片段,提高编程效率.该功能是从Xcode4 ...

  9. xcode自动生成代码片段

    一.什么是代码片段 当在Xcode中输入dowhile并回车后,Xcode会出现下图所示的提示代码: 这就是代码片段,目的是使程序员以最快的速度输入常用的代码片段,提高编程效率.该功能是从Xcode4 ...

随机推荐

  1. Juicer——a fast template engine

    https://blog.csdn.net/yutao_struggle/article/details/79201688 当前最新版本: 0.6.8-stable Juicer 是一个高效.轻量的前 ...

  2. iOS开发之 -- CocoPods的安装和使用

    以前项目中使用过Pods 1.0,最近项目中也有用到,因为很长时间没用了,所以配置了下,谁知道,中间出现了不少坑,特记录在此博客,其实pods的使用也就是几个终端命令而已,可能随着系统的升级,以前的终 ...

  3. css做鼠标指向图片图片放大但边框不放大

    这是一个圆形边框做的效果 HTML <div class="circle-wrapper"> <img src="" > </di ...

  4. 用Dialog 做自定义动画,加播放监听

    final Dialog customDialog = new Dialog(this); customDialog.setTitle(R.string.attention); customDialo ...

  5. 160317(二)、按sort排序,sort为空的在后面

    按sort排序,sort为空的在后面 select * from 表名 order by (case when sort is null or sort='' then 1 else 0 end),s ...

  6. Struts文件下载(静态)

    前言:在实际的开发中,我们可能需要动态下载和静态下载, 动态下载:例如我上传了一个文件,你想下载,那就必须动态生成下载链接,因为我服务器一开始是不知道我上传的东西是什么,放在那里, 静态下载:比如一些 ...

  7. CH5302 金字塔【区间DP】

    5302 金字塔 0x50「动态规划」例题 描述 虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下.经过多年的研究,科学家对这座金字塔的内部结构已经有所了解.首先,金字塔由若干房间 ...

  8. TCP控制位 sendUrgentData 队列 队列元素 优先级 极限 急停 置顶

    Socket (Java Platform SE 7 ) https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#sendUrge ...

  9. Fully qualified name FQCN

    Fully qualified name - Wikipedia https://en.wikipedia.org/wiki/Fully_qualified_name In computer prog ...

  10. 使用JavaMail发送邮件,465端口开启ssl加密传输

    package com.wangxin.test; import java.security.Security; import java.util.Date; import java.util.Pro ...