文章目录
  1. 1. 查看手册
  2. 2. 安装命令行工具
  3. 3. 查看版本号
  4. 4. 查看SDK
  5. 5. 编译
    1. 5.1. 项目级别的参数
    2. 5.2. 配置级别的参数
  6. 6. 打包
  7. 7. 其他

大家在开发 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
2
$ which xcodebuild                                                                                                                     
/usr/bin/xcodebuild

查看版本号

由于 xcodebuild 和 XCode 往往是一对一版本绑定的,所以这个命令显示的是 XCode 的版本号

1
2
3
$ xcodebuild -version                                                                                                                   
Xcode 9.3.1
Build version 9E501

查看SDK

查看已安装的SDK

1
2
3
4
5
6
7
8
9
10
11
12
13
$ xcodebuild -showsdks                                                                                                                   {14:16}
iOS SDKs:
iOS 11.3 -sdk iphoneos11.3

iOS Simulator SDKs:
Simulator - iOS 11.3 -sdk iphonesimulator11.3

macOS SDKs:
macOS 10.13 -sdk macosx10.13

tvOS SDKs:
tv
...

详细版,可以看到 SDK 安装路径等信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ xcodebuild  -version -sdk                                                                                                              {14:16}
iPhoneOS11.3.sdk - iOS 11.3 (iphoneos11.3)
SDKVersion: 11.3
Path: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk
PlatformVersion: 11.3
PlatformPath: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
BuildID: C689C3CA-2814-11E8-B440-EB6E943B87E0
ProductBuildVersion: 15E217
ProductCopyright: 1983-2018 Apple Inc.
ProductName: iPhone OS
ProductVersion: 11.3

iPhoneSimulator11.3.sdk - Simulator - iOS 11.3 (iphonesimulator11.3)
SDKVersion: 11.3
Path: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator11.3.sdk
PlatformVersion: 11.3
PlatformPath: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform
BuildID: C689C3CA-2814-11E8-B440-EB6E943B87E0
ProductBuildVersion: 15E217
ProductCopyright: 1983-2018 Apple Inc.
ProductName: iPhone OS
ProductVersion: 11.3

...

Xcode 9.3.1
Build version 9E501

编译

xcodebuild 是依赖于 Xcode 的project 文件的,所以它的 build 参数也是和 Xcode 上的操作一一对应。

项目级别的参数

参数 说明
-workspace 指定 workspace 文件
-project 指定 proj 文件
-target 指定 target
-scheme 指定 scheme

这四个概念大家在操作时容易囫囵吞枣地使用,下面稍作解释

  1. workspace 是一个项目的总文件,里面可以包含一个或者几个project, 一般大家会把项目依赖的 project,放在一个 workspace中,比如 Cocoapods 这个工具就把依赖放在了一个单独的叫Podsproject,让后通过 workspace 把项目组织在一起

  2. project 一个组织项目里代码和资源的文件。project 是必不可少,workspace是可选的。如果你只有一个project,并且不依赖其他project则是不需要workspace的。

  3. target 定义编译时需要哪些文件和资源,对环境有哪些要求,编译中要不要加入什么自定义的步骤。一个 project 可以有多个文件target, 比如在iOS和 macOS 共用代码的项目里,可以分别有 iOS 和 macOS 两个不同的target 每个 target 包含整个项目里自己需要的文件和设置。

  4. scheme 定义了你怎样使用target的方式,相当于在target外观有包了一层,属于定义target的外部环境。在什么环境下使用 target,是 Build,run,Test,Profile 等等。build 这个 target 要不要 Debug 的符号信息,跑起来编译好的二进制文件时,要不要带参数,带什么参数,二进制文件跑起来后应该生活在什么样的环境?系统语言是什么,Metal 要不要开启?二进制跑起来后要不要对程序的内存进行监控,比如Zombie Objects等等。
    因为scheme 是为target服务的,所以 Xcode 是创建target 是默认创建对应的scheme

好下面开始讲讲 xcodebuild 的用法

最简单的不要参数是可以直接工作的,他会找到默认的 workspaceprojectscheme

1
$ xcodebuild

一般情况我们明确指定,workspacescheme这两个基本参数就可以,没有 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
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>teamID</key>
<string>MYTEAMID123</string>
<key>method</key>
<string>app-store</string>
<key>uploadSymbols</key>
<true/>
</dict>
</plist>

其他

xcodebuild本身是系统黑盒工具,我们不能方便的完全掌控。 但是关于自动话build这个话题,还有很多开源的build工具,比如xctool,fastlane,我们可以很方便的使用和定制,后面有机会再讲。

文章目录
  1. 1. 查看手册
  2. 2. 安装命令行工具
  3. 3. 查看版本号
  4. 4. 查看SDK
  5. 5. 编译
    1. 5.1. 项目级别的参数
    2. 5.2. 配置级别的参数
  6. 6. 打包
  7. 7. 其他