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" 脚本。
脚本代码:
![](https://common.cnblogs.com/images/copycode.gif)
#
# 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}"
![](https://common.cnblogs.com/images/copycode.gif)
这个脚本使用 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 ...
随机推荐
- HTML和CSS网页开发基础
一 HTML文档结构 HTML文档结构:<html>.<head>.<title>.<body>构成HTML页面中最基本的元素. HTML常用标记:1. ...
- asp.net MVC 下拉多级联动及编辑
多级联动实现,附源码.当前,部分代码是参与博客园其它网友. 新增,前台代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 ...
- hibernate+struts2
一.环境 添加struts2和hibernate的jar包.创建web.xml(配置struts的过滤器).struts2.xml和hibernate.cfg.xml(设置一些数据库参数). 二.创建 ...
- 如何在mac里面,把xcode代码同步到 tfs 的 git库(克隆git篇)
如果是新的git库,还没有任何内容可以克隆,可以参考:http://www.cnblogs.com/IWings/p/6755795.html 在mac安装visual studio code htt ...
- modelsim 仿真软件 百度云分享 modelsim se 10.7 10.6d 10.6c 10.5 10.4
modelsim se 10.7 链接:https://pan.baidu.com/s/1NDC2yMCZmA4bIRSk2dUiTg 提取码:4l1d 复制这段内容后打开百度网盘手机App,操作更方 ...
- Django - app
1.app目录 migrations:数据库操作的记录(只记录修改表结构的记录); __init__文件:python2中必须填加,python3中无要求,可以不添加: admin:django为我们 ...
- js 图表转图片
最近项目上有个需求,是将一些teechart做的图表转换成图片插入自动生成的PDF里,Teechart绘图和如何生成PDF这些这里就不说了,这个任务比较别扭的一点是,图表自动生成,且整个过程中页面不能 ...
- [CodeForces] 274E Mirror Room
题意翻译 有一个n*m的格子图,其中有一些是黑色的,另一些为白色. 从某个白色格子的中心点向左上(NW),左下(SW),右上(NE),右下(SE)四个方向中的一个发出一束光线,若光线碰到黑色格子或者墙 ...
- Gym - 101611D Decoding of Varints(阅读理解题 )
Decoding of Varints 题意&思路: 首先根据红色边框部分的公式算出x,再有绿色部分得知,如果x是偶数则直接除以2,x是奇数则(x+1)/-2. PS:这题有数据会爆掉un ...
- [luogu2591 ZJOI2009] 函数
传送门 Solution 画图找规律.. Code //By Menteur_Hxy #include <cstdio> #define min(a,b) ((a)>(b)?(b): ...