什么是 Xcode Command Line Tools
Xcode Command Line Tools 是一个独立的小型包,让开发者可以在 macOS 中进行命令行开发。它由安装在/Library/Developer/CommandLineTools
目录中的 macOS SDK 和命令行工具(例如 Clang)组成。安装方式如下:
- 安装 Xcode
- 从 苹果开发者官网下载
- 通过运行
xcode-select --install
安装
xcode-select
什么是xcode-select
xcode-select
用于管理开发者到底使用哪一个 developer 工具目录,它可以使得开发者轻松地在不同版本的 Xcode 之间切换工具,并且在 Xcode 移动时更新其路径。关于 xcode-select
更多信息可以参照手册页
xcode-select 的使用
-
xcode-select -- switch [Xcode.app path]
通过指定 Xcode.app 的路径选择想要使用的 command line developer tools
-
xcode-select -p
输出当前选择的路径
-
xcode-select -r
重置到默认的 command line developer tools
Xcodebuild
什么是 xcodebuild
xcodebuild 是一个命令行工具,允许开发者从命令行对 Xcode 项目和工作区执行构建、查询、分析、测试和归档操作。它可以对 Project 中的 Target、 Workspace 或者 Project 中的 Scheme 进行操作。xcodebuild 提供了几个选项来执行这些操作,如其手册页所示。默认情况下, xcodebuild 将命令的输出保存在 Xcode -> Preferences -> Locations
的 Derived Data
和 Archives
中。
xcodebuild 的使用
要构建 Xcode 工程,需要在工程文件夹所在目录运行 xcodebuild 命令。
action
在执行 xcodebuild 大部分命令时,会需要指定的 action。下面是常用的 action:
action | 描述 |
---|---|
build | 默认的 action,未指定 action 时会使用 build,构建工程生成 Product |
archive | 编译、归档生成 .xcarchive 包,可以指定输出路径 |
Clean | 从构建根目录中删除 Product 目录 和 临时文件 |
构建Project
xcodebuild [-project name.xcodeproj]
[[-target targetname] ... | -alltargets]
[-configuration configurationname]
[-sdk [sdkfullpath | sdkname]] [action ...]
[buildsetting=value ...] [-userdefault=value ...]
xcodebuild [-project name.xcodeproj] -scheme schemename
[[-destination destinationspecifier] ...]
[-destination-timeout value] [-configuration configurationname]
[-sdk [sdkfullpath | sdkname]] [action ...]
[buildsetting=value ...] [-userdefault=value ...]
-
clean
xcodebuild clean -project name.xcodeproj -target targetName
-
build
在构建 project 时,默认 xcodebuild 会构建 project 中 target 列表中的第一个以及默认的 configuration。
xcodebuild build -project name.xcodeproj
-
archive
归档,将工程编译生成一个
.xcarchive
文件,-archivePath
指定输出目录路径。xcodebuild archive -project name.xcodeproj -scheme scheme -archivePath 希望输出的位置
构建 Workspace
xcodebuild -workspace name.xcworkspace -scheme schemename
[[-destination destinationspecifier] ...]
[-destination-timeout value] [-configuration configurationname]
[-sdk [sdkfullpath | sdkname]] [action ...]
[buildsetting=value ...] [-userdefault=value ...]
要构建 Workspace,必须同时通过 -workspace
和 -scheme
定义构建的选项。Scheme 中的参数将会控制构建每一个 target 如何构建,关于 Scheme 可以查看。下面是构建 Workspace 最基础的命令举例:
xcodebuild clean -workspace ${workspace_name}.xcworkspace -scheme ${scheme_name}
xcodebuild archive -workspace MyWorkspace.xcworkspace -scheme MyScheme
构建过程中常用到的选项
除了 -workspace
、-project
、 -target
、 -scheme
以外,还有一些其它的选项可能会用到,如下:
-
-configuration
指定构建配置。一般的,多 Scheme 情况下不需要用到这个参数,因为每个 Scheme 都有对应的 Build Configuration,仅在单个 Scheme 的情况下,需要指定 Configuration 时可以用这个选项,比如 Debug、Release等等。
-
-sdk
指定 sdk 路径。当电脑中有多个 Xcode 版本时,一般情况会用默认 Xcode Command Line Tool 的 sdk,可以通过 -showsdks 获取其它 sdk 路径后,在作为 -sdk 的 Value。
-
-arch
指定架构类型 architecture,比如
arm64
-
-allowProvisioningUpdates
允许更新描述文件。需要配置
Xcode->Preferences->Account
-
-xcconfig
指定 xcconfig 文件。
xcconfig
的内容会覆盖其它的 Build Settings buildsetting=value
指定 Build settings 中的内容。例如: ARCHS=arm64
,和 xcconfig 文件的写法一样
Export
Export 主要是的对生成的 .xcarchive 文件进行进一步的处理,根据 ExportOptions.plist
生成相应的 ipa,相应的命令如下:
xcodebuild -exportArchive -archivePath -exportPath -exportOptionsPlist
其中,ExportOptions.plist
中包含了分发方法:app-store
、ad-hoc
、enterprise
、development
,以及分发选项和分发签名选项。可以通过 xcodebuild -help
查看文件可用的 Key:
Available keys for -exportOptionsPlist:
compileBitcode : Bool
...
embedOnDemandResourcesAssetPacksInBundle : Bool
...
iCloudContainerEnvironment
...
manifest : Dictionary
...
method : String
...
onDemandResourcesAssetPacksBaseURL : String
...
teamID : String
...
thinning : String
...
uploadBitcode : Bool
...
uploadSymbols : Bool
...
当然最便捷的办法就是通过 Xcode 导出一次 ipa 包,在输出的文件夹内存放了对应的 ExportOptions.plist
文件。
Other Options
还有几个选项可以显示有关已安装设备的信息、Xcode 版本 以及关于 Project 或 Workspace 的信息
-
-list
; -showBuildSettings
-
-showdestinations
, -showsdks
-version
xcrun
xcrun 是 Command Line Tools 中的一员。它的作用类似 RubyGem 里的 bundle ,用于控制执行环境。其作用是根据 xcode-select 设置的默认目录定位或者执行开发命令行工具,因此系统中如果安装了多个版本的Xcode,推荐使用 xcrun。
当与 --find
参数一起使用时,如 xcrun --find clang
会输出工具 clang 所在位置的绝对路径。
在没有 --find
的情况下使用,则需要 command
的名称和将使用提供的参数执行,如 xcrun xcodebuild -list
。
altool
altool 同样是 Xcode Command Line Tools 用于验证构建版本或将有效构建版本自动上传至 App Store。可以通过xcrun --find altool
查找其位置:
/Applications/Xcode.app/Contents/Developer/usr/bin/altool
altool 参数
altool
分为两步,验证指定的 App,上传指定的 App,可以查看其手册页:
位置 | 详细说明 |
---|---|
--validate-app |
要验证指定的 App。 |
--upload-app 、--upload-package |
要上传指定的 App。 |
-f file |
正在验证或上传的 App 的路径和文件名。 |
-u username |
用户名。 |
-p password |
App 专用密码。 |
--apiKey |
apiKey,私钥文件AuthKey_ ,存储位置 ~/.private_keys |
--apiIssuer |
Issuer ID ,在 App Store Connect -> 用户和访问 -> 密钥 查看 Issuer ID |
用户认证信息的获取
altool
在上传时需要开发者的用户名 username
和 App 专用密码 password
或者使用 apiKey
和 apiIssuer
用于认证用户信息。
-
App 专用密码的获取
- 登录 appleid.apple.com。
- 在“登录和安全”部分中,点按“App 专用密码”。
- 点按“生成 App 专用密码”或点按
,然后按照屏幕上的步骤操作。
-
apiKey
和apiIssuer
的获取- 使用开发者账号访问 https://appstoreconnect.apple.com 登录 App Store Connect 首页,点击【用户与访问】
- 选择【密钥】生成
AuthKey_
密钥下载保存(只能下载一次),.p8 api_key
填入--apiKey
参数, - 在终端复制执行
cd ~ && mkdir .private_keys
创建隐藏文件夹,再将下载的AuthKey_
文件复制或移动到.p8 ~/.private_keys
隐藏文件夹下
altool 的使用
-
验证 App
xcrun altool --validate-app -f file_path --type "{macos | ios | appletvos}" {-u username [-p password] | --apiKey api_key --apiIssuer issuer_id}
-
上传 App
-
使用
--upload-package
xcrun altool --upload-package file_path --type {macos | ios | appletvos} --asc-public-id id --apple-id id --bundle-version version --bundle-short-version-string string --bundle-id id {-u username [-p password] | --apiKey api_key --apiIssuer issuer_id}
-
使用
--upload-app
xcrun altool --upload-app -f file_path --type "{macos | ios | appletvos}" {-u username [-p password] | --apiKey api_key --apiIssuer issuer_id} [DEPRECATED use --upload-package]
-