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库尔,能够说是在互联网上最酷的名字。他纠正了我的新执行脚本
的一些潜在的问题。上面的脚本也已经更新。
严格来说,在2014就改名字了.
- 在Bloglovin,我们会在固定的时间解决六个不同分支问题。
版本冲突每天都会发生。
尽管不是一个大的问题。我不喜欢这个特定的生成,这将会导致难以识别的崩溃日志。
这样的在版本后面加后缀的方法应该能够解决问题。
Xcode 自己主动生成版本技术最佳实践的更多相关文章
- SVN版本控制系统最佳实践
第1章SVN介绍及应用场景 1.1什么是SVN(Subversion) Svn(subversion)是近年来崛起非常优秀的版本管理工具,与CVS管理工具一样,SVN是一个跨平台的开源的版本控制系统. ...
- Web前端开发最佳实践(7):使用合理的技术方案来构建小图标
大家都对网站上使用的小图标肯定都不陌生,这些小图标作为网站内容的点缀,增加了网站的美观度,提高了用户体验,可是你有没有看过在这些网站中使用的图标都是用什么技术实现的?虽然大部分网站还是使用普通的图片实 ...
- 聊聊Go代码覆盖率技术与最佳实践
"聊点干货" 覆盖率技术基础 截止到Go1.15.2以前,关于覆盖率技术底层实现,以下知识点您应该知道: go语言采用的是插桩源码的形式,而不是待二进制执行时再去设置breakpo ...
- 【大数据和云计算技术社区】分库分表技术演进&最佳实践笔记
1.需求背景 移动互联网时代,海量的用户每天产生海量的数量,这些海量数据远不是一张表能Hold住的.比如 用户表:支付宝8亿,微信10亿.CITIC对公140万,对私8700万. 订单表:美团每天几千 ...
- XPages访问关系型数据库技术与最佳实践
XPage 对于 Domino 开发人员的一大好处就是能够很方便和高效的访问关系型数据库.本文通过实例代码展现了在 XPage 中访问关系型数据库的具体步骤 , 同时讲解了一些在 XPage 中高效访 ...
- Python自动化运维:技术与最佳实践 PDF高清完整版|网盘下载内附地址提取码|
内容简介: <Python自动化运维:技术与最佳实践>一书在中国运维领域将有“划时代”的重要意义:一方面,这是国内第一本从纵.深和实践角度探讨Python在运维领域应用的著作:一方面本书的 ...
- 快读《ASP.NET Core技术内幕与项目实战》WebApi3.1:WebApi最佳实践
本节内容,涉及到6.1-6.6(P155-182),以WebApi说明为主.主要NuGet包:无 一.创建WebApi的最佳实践,综合了RPC和Restful两种风格的特点 1 //定义Person类 ...
- Atitit.log日志技术的最佳实践attilax总结
Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...
- 镜像命名的最佳实践 - 每天5分钟玩转 Docker 容器技术(18)
我们已经学会构建自己的镜像了.接下来的问题是如何在多个 Docker Host 上使用镜像. 这里有几种可用的方法: 用相同的 Dockerfile 在其他 host 构建镜像. 将镜像上传到公共 R ...
随机推荐
- 最新省市区划分码code
爬取国家统计局省市区code 提供php爬取脚本以及json和sql https://github.com/zzDylan/area-code 觉得好用给个star,3q
- WinForm窗体项目 之 MySchool管理系统终极版
学习WinForm窗体程序也有一段时间了,今天就来尝试着来一个项目热热身~ 在我们通常使用的MySchool管理中,不外乎这几种功能:增.删.改.查.改密码 在过去的C#中确实是挺简单的,但是在学习了 ...
- Java——Spring介绍
spring 是一个开源框架,是为了解决企业应用程序开发. 功能如下:1.目的:解决企业应用开发的复杂性.2.功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能.3.范围:任何Ja ...
- Android项目实战_手机安全卫士系统加速
## 1.本地数据库自动更新的工作机制1. 开启一个服务,定时访问服务器2. 进行版本对比,如果最新版本比较高,获取需要更新的内容3. 将新内容插入到本地数据库中 ## 2.如何处理横竖屏切换1. 指 ...
- C#——数据库的访问
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- [Windows Server 2012] Filezilla安全加固方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:FileZ ...
- cookie和sessionStorage 、localStorage 对比
相同点:都存储在客户端 不同点:1.存储大小 cookie数据大小不能超过4k. sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或 ...
- 【sqli-labs】 less50 GET -Error based -Order By Clause -numeric -Stacked injection(GET型基于错误的整型Order By从句堆叠注入)
报错没有关闭,直接可以用UpdateXml函数 http://192.168.136.128/sqli-labs-master/Less-50/?sort=1 and UpdateXml(1,conc ...
- 谷歌浏览器中a:link设置字体颜色无效问题
<div id="box"> <a href="#">111111</a> <a href=""& ...
- Python 函数 day3
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...