目录
- 前言
- Shell脚本涉及的工具
- xcodebuild和xcrun
- altool
- fir-cli
- PlistBuddy
- 一些概念的区别
- 具体实现
- xcodebuild和xcrun
- 准备Plist文件
- 获取命令行参数
- 清理构建目录
- 编译打包成Archive
- 将Archive导出
- 上传到Fir
- 验证并上传到App Store
- 邮件通知相关同事
- 上传符号表到Bugly
- 简单例子
- 对比实验
- 三种方式的对比
- xcodebuild+xcrun和仅xcodebuild的比较
- 命令到底做了什么
- 总结
前言
现在涉及到编译打包的工作主要是以下两个:
- 提交测试版本给测试同事
- 提交App Store审核
两个流程分别是:
- 修改证书和配置文件,然后「Product -> Archive」编译打包,之后在自动弹出的 「Organizer」 中进行选择,根据需要导出 ad hoc enterprise 类型的 ipa 包。等待导出之后再提交到Fir上,等Fir提交完成就需要告知测试同事。整个流程下来一般都要半个多小时,而且需要人工监守操作。
- 第二个也是差不多,打包完之后需要操作几个步骤然后上传到App Store,上传时间较长,而且中间可能会有错误需要处理。上传后等待苹果处理二进制包,苹果处理后上去选择构建包,点击提交审核。
所以研究下自动化编译打包,提高下效率,减少人工操作成本。
主要有两种实现途径,AppleScript和Shell脚本,AppleScript
没怎么研究,网上说是很强大的脚本语言。
下面主要讲Shell脚本的实现,网上也有人实现了并托管在github
上,可以参考下。
Shell脚本涉及的工具
主要是以下几个工具:
- xcodebuild
- xcrun
- altool(提交到App Store使用)
- fir-cli(上传到fir时使用)
- Python的smtplib(之前已经写过python的发邮件了,所以就直接用没有用Shell写。)
- PlistBuddy
- BuglySymboliOS(Bugly的符号表工具包)
xcodebuild和xcrun
xcodebuild
和xcrun
都是来自Command Line Tools
,Xcode自带,如果没有可以通过以下命令安装:
xcode-select --install
或者在下面的链接下载安装:
安装完可在以下路径看到这两个工具:
/Applications/Xcode.app/Contents/Developer/usr/bin/
- xcodebuild
主要是用来编译,打包成Archive和导出ipa包。
可以执行 xcodebuild -help
查看,主要展示了几种用法、一些可选项,最后是比较重要的exportOptionsPlist文件的一些可选key,这个文件在后面导出ipa包会用到。
主要下面三个查看的命令比较重要:
-showsdks display a compact list of the installed SDKs
-showBuildSettings display a list of build settings and values
-list lists the targets and configurations in a project, or the schemes in a workspace
后面两个需要在Xcode的project或者workspace目录下才能用。
- xcrun
xcrun -h
主要是打包,看网上比较多是用这个工具打包各种渠道包。
altool
这个工具在网上搜索几乎没有什么结果,大概国内直接用命令行工具提交App Store的比较少。后来在StackOverflow上才找到相关的文档:
https://itunesconnect.apple.com/docs/UsingApplicationLoader.pdf
在上面的文档第38页讲述了如何使用altool上传二进制文件。
这个工具实际上是ApplicationLoader,打开Xcode-左上角Xcode-Open Developer Tool-Application Loader 可看到。有个“交付您的应用”操作,网上看到有人是直接用这个工具上传的。
altool的路径是:
/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Support/altool
使用时会提示下面的错误:
altool[] *** Error: Exception while launching iTunesTransporter:
Transporter not found at path: /usr/local/itms/bin/iTMSTransporter.
You should reinstall the application.
建立个软链接可解决(类似于Windows的快捷方式):
ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms
fir-cli
安装时会提示各种权限不允许,可以执行下面命令:
echo 'gem: --bindir /usr/local/bin' >> ~/.gemrc
sudo 'gem install fir-cli
fir有提供Android Studio、Eclipse、gradle插件,可以看下。
这是�它的github地址,其中讲到有对?xcodebuild
?原生指令进行了封装。
PlistBuddy
Plist在Mac OSX系统中起着举足轻重的作用,系统和程序使用Plist文件来存储自己的安装/配置/属性等信息。而PlistBuddy是Mac里一个用于命令行下读写plist文件的工具,在/usr/libexec/下。可以通过它读取或修改plist文件的内容。
这里我仅通过它来获取内部版本号、外部版本号。在一些文章中见过用来修改plist文件的信息来导出出不同需要的包。
一些概念的区别
Workspace、Project、Scheme、Target的区别。
下面是官方文档:
下面从上往下大概说下,具体看文档比较好:
Workspace
Workspace
是最大的集合,可以包含多个Project
,可以管理不同的Project
之间的关系。Workspace
是以xcworkspace
的文件形式存在的。(这点和Project
一致)。Workspace
的存在是为了解决原来仅有Project
的时候不同的Project
之间的引用和调用困难的问题。同时,一个Workspace
的Project
共用一个编译路径。比如使用CocoaPod、或者使用其他开发库/框架。Project
Project
是一个仓库,包含编译一个或多个product
所需的文件、资源和信息,保持和聚合这些元素间的关系。(每个Target
能指定自己的Build Settings
来覆盖Project
的)
- Source code, including header files and implementation files
- Libraries and frameworks, internal and external
- Resource files