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库尔,能够说是在互联网上最酷的名字。他纠正了我的新执行脚本

的一些潜在的问题。上面的脚本也已经更新。


  1. 严格来说,在2014就改名字了.

  2. 在Bloglovin,我们会在固定的时间解决六个不同分支问题。

    版本冲突每天都会发生。

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

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

 原文链接:

Xcode 自己主动生成版本技术最佳实践的更多相关文章

  1. SVN版本控制系统最佳实践

    第1章SVN介绍及应用场景 1.1什么是SVN(Subversion) Svn(subversion)是近年来崛起非常优秀的版本管理工具,与CVS管理工具一样,SVN是一个跨平台的开源的版本控制系统. ...

  2. Web前端开发最佳实践(7):使用合理的技术方案来构建小图标

    大家都对网站上使用的小图标肯定都不陌生,这些小图标作为网站内容的点缀,增加了网站的美观度,提高了用户体验,可是你有没有看过在这些网站中使用的图标都是用什么技术实现的?虽然大部分网站还是使用普通的图片实 ...

  3. 聊聊Go代码覆盖率技术与最佳实践

    "聊点干货" 覆盖率技术基础 截止到Go1.15.2以前,关于覆盖率技术底层实现,以下知识点您应该知道: go语言采用的是插桩源码的形式,而不是待二进制执行时再去设置breakpo ...

  4. 【大数据和云计算技术社区】分库分表技术演进&最佳实践笔记

    1.需求背景 移动互联网时代,海量的用户每天产生海量的数量,这些海量数据远不是一张表能Hold住的.比如 用户表:支付宝8亿,微信10亿.CITIC对公140万,对私8700万. 订单表:美团每天几千 ...

  5. XPages访问关系型数据库技术与最佳实践

    XPage 对于 Domino 开发人员的一大好处就是能够很方便和高效的访问关系型数据库.本文通过实例代码展现了在 XPage 中访问关系型数据库的具体步骤 , 同时讲解了一些在 XPage 中高效访 ...

  6. Python自动化运维:技术与最佳实践 PDF高清完整版|网盘下载内附地址提取码|

    内容简介: <Python自动化运维:技术与最佳实践>一书在中国运维领域将有“划时代”的重要意义:一方面,这是国内第一本从纵.深和实践角度探讨Python在运维领域应用的著作:一方面本书的 ...

  7. 快读《ASP.NET Core技术内幕与项目实战》WebApi3.1:WebApi最佳实践

    本节内容,涉及到6.1-6.6(P155-182),以WebApi说明为主.主要NuGet包:无 一.创建WebApi的最佳实践,综合了RPC和Restful两种风格的特点 1 //定义Person类 ...

  8. Atitit.log日志技术的最佳实践attilax总结

    Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...

  9. 镜像命名的最佳实践 - 每天5分钟玩转 Docker 容器技术(18)

    我们已经学会构建自己的镜像了.接下来的问题是如何在多个 Docker Host 上使用镜像. 这里有几种可用的方法: 用相同的 Dockerfile 在其他 host 构建镜像. 将镜像上传到公共 R ...

随机推荐

  1. Spring Cloud (8) 服务容错保护-Hystrix依赖隔离

    依赖隔离 docker使用舱壁模式来实现进程的隔离,使容器与容器之间不会互相影响.而Hystrix则使用该模式实现线程池的隔离,它会为每一个Hystrix命令创建一个独立的线程池,这样就算在某个Hys ...

  2. Java系列学习(四)-运算计算

    1.运算符 (1)算术运算符 A:+,-,*,/,%,++,-- B:+的用法 [a.加法] [b.正号] [c.字符串连接付] C:/和%的区别 [数据做除法的时候,/取的是商,%取的是余数] D: ...

  3. Android基础TOP2_1:输出系统时间

    Activity: <TextView android:id="@+id/tv" android:layout_width="wrap_content" ...

  4. SpringBoot 搭建

    1.使用Eclipse 建立Maven项目(webapp OR quickstart) 2.配置Maven,如下: <parent> <groupId>org.springfr ...

  5. html5——多列布局

    基本概念 1.多列布局类似报纸或杂志中的排版方式,上要用以控制大篇幅文本. 2.跨列属性可以控制横跨列的数量 /*列数*/ -webkit-column-count: ; /*分割线*/ -webki ...

  6. [Windows Server 2003] 安装PHP+MySQL方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:PHP+MyS ...

  7. ffmpeg从内存读取文件

    正常情况,ffmpeg直接从文件读取 AVFormatContext * _ctx = NULL; avformat_open_input(&_ctx, _filePath, 0, 0); 我 ...

  8. WinMTR使用教程

    WinMTR下载链接:https://share.weiyun.com/53iPoC7 WinMTR官网连接:http://winmtr.net/download-winmtr/ WinMTR 使用方 ...

  9. 【上海站】EOLINKER 用户培训之旅,等你来共建API新连接

    从今年3月4日起,EOLINKER AMS 团队将再次开启全国用户培训之旅.本次全国培训之旅依旧将覆盖北上广深等国内主要城市,重点提供两种服务内容,一是 对 EOLINKER 产品的交流,包括 API ...

  10. S-HR之OSF

    1):getWorkDayCount ->ArrayList data = (ArrayList) com.kingdee.shr.rpts.ctrlreport.osf.OSFExecutor ...