详解xcodebuild
大家在开发 iOS/macOS程序中,基本都是直接用 Xcode来开发,很少接触 xcodebuild,但是如果命令运行 xcode 的项目(比如自建 CI),那么 xcodebuild 是绕不过去的,目前网上关于 xcodebuild 的使用文章很多,但是详细理清的很少。本文尝试理清讲下xcodebuild 以飨来者。
查看手册
有任何 xcodebuild的使用问题, 搜索之后找不到答案的,建议看手册
1 | man xcodebuild |
安装命令行工具
xcodebuild是打包在Command Line Tools
中, Xcode.app
依赖 Command Line Tools
。如果没有安装该工具,则需要从Apple Developer网站下载
装好了后,可以运行which检查下。
1 | which xcodebuild |
查看版本号
由于 xcodebuild 和 XCode 往往是一对一版本绑定的,所以这个命令显示的是 XCode 的版本号
1 | $ xcodebuild -version |
查看SDK
查看已安装的SDK
1 | $ xcodebuild -showsdks {14:16} |
详细版,可以看到 SDK 安装路径等信息
1 | $ xcodebuild -version -sdk {14:16} |
编译
xcodebuild 是依赖于 Xcode 的project 文件的,所以它的 build 参数也是和 Xcode 上的操作一一对应。
项目级别的参数
参数 | 说明 |
---|---|
-workspace | 指定 workspace 文件 |
-project | 指定 proj 文件 |
-target | 指定 target |
-scheme | 指定 scheme |
这四个概念大家在操作时容易囫囵吞枣地使用,下面稍作解释
workspace
是一个项目的总文件,里面可以包含一个或者几个project
, 一般大家会把项目依赖的project
,放在一个workspace
中,比如 Cocoapods 这个工具就把依赖放在了一个单独的叫Pods
的project
,让后通过workspace
把项目组织在一起project
一个组织项目里代码和资源的文件。project
是必不可少,workspace
是可选的。如果你只有一个project
,并且不依赖其他project
则是不需要workspace
的。target
定义编译时需要哪些文件和资源,对环境有哪些要求,编译中要不要加入什么自定义的步骤。一个 project 可以有多个文件target
, 比如在iOS和 macOS 共用代码的项目里,可以分别有 iOS 和 macOS 两个不同的target
每个 target 包含整个项目里自己需要的文件和设置。scheme
定义了你怎样使用target
的方式,相当于在target
外观有包了一层,属于定义target
的外部环境。在什么环境下使用 target,是 Build,run,Test,Profile 等等。build 这个 target 要不要 Debug 的符号信息,跑起来编译好的二进制文件时,要不要带参数,带什么参数,二进制文件跑起来后应该生活在什么样的环境?系统语言是什么,Metal 要不要开启?二进制跑起来后要不要对程序的内存进行监控,比如Zombie Objects
等等。
因为scheme
是为target
服务的,所以 Xcode 是创建target
是默认创建对应的scheme
好下面开始讲讲 xcodebuild
的用法
最简单的不要参数是可以直接工作的,他会找到默认的 workspace
、 project
、 scheme
1 | xcodebuild |
一般情况我们明确指定,workspace
、 scheme
这两个基本参数就可以,没有 workspace
的则指定project
。
1 | xcodebuild -workspace TestProject.xcworkspace -scheme TestProject |
配置级别的参数
这一级别的参数,是为了覆盖项目文件已经设置的值
参数 | 说明 |
---|---|
-sdk | |
-configuration | |
-destination | |
-arch |
以上仅列出,具体可参考man page,深入看看细节
打包
1 | xcodebuild -exportArchive -archivePath <xcarchivepath> -exportPath <destinationpath> -exportOptionsPlist <plistPath> |
archive path 和 destination path只需要制定文件夹路径就可以。plist path 需要制定一个定制话的plist 来定义导出什么样的package,最简单的如下:
1 | "1.0" encoding="UTF-8" xml version= |
其他
xcodebuild本身是系统黑盒工具,我们不能方便的完全掌控。 但是关于自动话build这个话题,还有很多开源的build工具,比如xctool,fastlane,我们可以很方便的使用和定制,后面有机会再讲。