xcodebuild 是什么?

根据 OS X Man Pages:xcodebuild 可以编译在一个 Xcode project 里的一个或多个 targets,或者编译 Xcode workspace 或 Xcode project 内的一个 scheme。

说白了,就是 Apple 提供的一个命令行工具,可以在没有图形界面的情况下编译程序。

有的同学可能会有疑问,我平时在 Xcode 上一按 command + b 程序就可以编译了啊, 用 xcodebuild 这个程序做什么?这个问题问得不错。

对于平时自己一个人或者团队比较小的情况,xcodebuild 的确没有用,编译个程序还得用到 CLI,确实有点蛋疼。但是对于团队合作就不同了,因为程序员比较多,而且有专职的测试人员。对于某个 Git 分支产生的变化,都需要编译出一个新的版本,然后生成 .ipa 的安装文件给 QA 或者公司的其他人员测试和使用。这个编译工作就不能交给某个人来做,而是应该交给一台服务器。

CI 的概念就这么来了。CI 其实就是一个帮助你编译的服务器程序,并且可以把编译的结果打包。是不是很神奇?那么这个服务器的编译,需要一段脚本程序来启动。针对编译 iOS 程序,就需要使用 xcodebuild 了。

使用 xcodebuild

Build

具体的使用的方式可以参照 OS X Man Pages(也可以 man xcodebuild),下面我给出具体的一个例子。

假如有一个应用,使用 Cocoapods 创建,它的名字是 XYDemo,主程序的 scheme 是 XYDemo,那么编译它的话,可以执行以下代码:

1
2
3
4
xcodebuild -workspace XYDemo.xcworkspace \
-scheme "XYDemo" \
-sdk iphonesimulator \
-destination 'platform=iOS Simulator,name=iPhone 6,OS=9.0'

这样程序就会跑起来,然后最后返回给你编译是成功还是失败了。

Archive

Archive 也一样简单,执行以下代码:

1
2
3
4
5
xcodebuild -workspace XYDemo.xcworkspace \
-scheme "XYDemo" \
clean \
archive \
-archivePath "build/XYDemo"

执行的结果是,在当前目录的 build 目录下,生成一个 XYDemo.xcarchive 的文件。

Export

要想导出 .ipa 文件呢?

1
2
3
4
xcodebuild -exportArchive -exportFormat ipa \
-archivePath "build/XYDemo.xcarchive" \
-exportPath "build/XYDemo.ipa" \
-exportProvisioningProfile "ProvisioningProfileName"

这会在 build 目录下生成 XYDemo.ipa 文件。如果你需要在导出的时候带证书的话,还要添加 -exportProvisioningProfile 证书文件名 参数。

Test

不光是单元测试,今年出的 UITesting 也可以使用 xcodebuild 来进行。

1
2
3
4
5
6
xcodebuild -workspace XYDemo.xcworkspace \
-scheme "XYDemoReleaseUITests" \
-sdk iphonesimulator \
-destination 'platform=iOS Simulator,name=iPhone 6,OS=9.0' \
-resultBundlePath "build" \
test

-resultBundlePath 参数可以输出测试的信息,包括测试每一步的截图。

最后再给大家推荐一个和 xcodebuild 结合使用的工具 xcpretty,它能将 xcodebuild 生成的结果按照格式进行处理,而且可以生成测试结果的 HTML 文件,非常赞。

我能用 xcodebuild 做什么?

一般地情况下,是很少用到它的。
我能想到的使用场景有:

  1. 团队开发,使用 CI 的时候,需要编写 build 的脚本。
  2. 很喜欢使用 CLI 的用户。

Ps,在 GitHub 的许多开源项目,也会集成 CI 服务,比如 Travis CI。在合并了某个贡献者分支的代码的时候,CI 就会根据脚本自动 build 一次,然后给出提示,很有意思。另外,它对于开源项目是免费的,有兴趣的,可以用它来体验一下。

参考: