xcodebuild、xcrun和 altool

什么是 Xcode Command Line Tools

  Xcode Command Line Tools 是一个独立的小型包,让开发者可以在 macOS 中进行命令行开发。它由安装在/Library/Developer/CommandLineTools目录中的 macOS SDK 和命令行工具(例如 Clang)组成。安装方式如下:

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 -> LocationsDerived DataArchives 中。

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 <xcarchivepath> -exportPath <destinationpath> -exportOptionsPlist <path>

  其中,ExportOptions.plist 中包含了分发方法:app-storead-hocenterprisedevelopment,以及分发选项和分发签名选项。可以通过 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

  xcrunCommand 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_<api_key>.p8,存储位置 ~/.private_keys
--apiIssuer Issuer ID ,在 App Store Connect -> 用户和访问 -> 密钥 查看 Issuer ID

用户认证信息的获取

  altool 在上传时需要开发者的用户名 username 和 App 专用密码 password 或者使用 apiKeyapiIssuer 用于认证用户信息。

  • App 专用密码的获取

    1. 登录 appleid.apple.com
    2. 在“登录和安全”部分中,点按“App 专用密码”。
    3. 点按“生成 App 专用密码”或点按
      蓝色加号图标

      ,然后按照屏幕上的步骤操作。

  • apiKeyapiIssuer 的获取

    1. 使用开发者账号访问 https://appstoreconnect.apple.com 登录 App Store Connect 首页,点击【用户与访问】
    2. 选择【密钥】生成 AuthKey_<api_key>.p8密钥下载保存(只能下载一次),api_key 填入 --apiKey 参数,
    3. 在终端复制执行 cd ~ && mkdir .private_keys创建隐藏文件夹,再将下载的 AuthKey_<api_key>.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]
      
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容