前言:
今天认真研究了一下Jenkins持续集成iOS项目(我会再找时间单独总结这部分内容),那就不得不提一下Xcodebuild命令,当然今天的重点就是这个啦。
正文:
平时我们打包ipa文件,一般都是通过GUI操作进行,大家觉得很简单,但作为会偷懒的程序猿,我们当然采用更加简单的方式了。就是通过执行简单的命令,静静的等待整个过程完成。那xcodebuild 这个命令就是来完成这个事情的。
目前已经有不少封装得很不错的第三方打包服务可以用,比如最出名的有 AFNetworking 的作者 mattt 大大的 shenzhen (没错,就是深圳),还有一个名叫 gym 也很不错。这些库都是对 xcodebuild 这个命令做了一些封装,更方便使用而已。
什么是xcodebuild?
xcodebuild 命令是 Xcode Command Line Tools 的一部分。通过调用这个命令,可以完成 iOS 工程的编译,打包和签名过程。这个命令随着 Xcode 的版本不同使用方法上也会有所不同。打开命令行,调用以下命令查看使用方法:
xcodebuild --help
上面截图中显示了命令执行结果。
语法:
在shell里面 [ ]表示这个参数是可选的,< > 表示参数是必须的。
如:
xcodebuild [-project name.xcodeproj] -scheme schemename [[-destination destinationspecifier] …] [-destination-timeout value] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]
- -project 你的项目名字,该项目会负责管理生成一个或者多个软件产品的全部文件和配置,一个Project可以包含多个Target。
- Workspace:简单来说,Workspace就是一个容器,在该容器中可以存放多个你创建的Xcode Project, 以及其他的项目中需要使用到的文件。使用Workspace的好处有:
- 扩展项目的可视域,即可以在多个项目之间跳转,重构,一个项目可以使用另一个项目的输出。Workspace会负责各个Project之间提供各种相互依赖的关系;
- 多个项目之间共享Build目录。
- -target 不过可以通过xcodebuild -list获取
- -configrtion 默认就是Debug和Release这两个版本,没有指定默认为Release版本,也可以通过xcodebuild -list获取
- -sdk 这个可由 xcodebuild -showsdks得到,一般都是默认
- Scheme:一个定义好构建过程的Target成为一个Scheme。可在Scheme中定义的Target的构建过程buildaction 有:Build/Run/Test/Profile/Analyze/Archive
- BuildSetting:配置产品的Build设置,比方说,使用哪个Architectures?使用哪个版本的SDK?。在Xcode Project中,有Project级别的Build Setting,也有Target级别的Build Setting。Build一个产品时一定是针对某个Target的,因此,XCode中总是优先选择Target的Build Setting,如果Target没有配置,则会使用Project的Build Setting。
let's see see xcodebuild -list
:
这样我们想要的Target有了,Schemes也有了,Configurations也有了。
再来看看xcodebuild -showsdks
:
用下面这个命令查看项目配置:
xcodebuild -target <target> -configuration <configuration> -showBuildSettings
那参数咱们也了解了,下面开始构建吧。
打包签名:
首先进入工程目录,执行以下命令:
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 …]
参数说明:SchemeName 就是工程的 scheme 的名字。
命令中可以添加一些参数实现在命令执行时配置不同的环境。比如,如果想 archive 出 Debug 环境的包,那么就可以在命令中添加 -configuration Debug 参数。对于非 workspace 的工程,还可以通过添加 PROVISIONING_PROFILE=的参数来指定签名所用的 Profile 文件,参数的值为 profile 文件的 UUID。
如果工程使用了 Cocoapods 来管理第三方库或使用workspace,那么命令的执行方式上有所不同,因为 Cocoapods 会把工程变成一个 workspace。将 workspace 工程 archive 的命令如下。
xcodebuild -workspace name.xcworkspace -scheme schemename [[-destination destinationspecifier] …] [-destination-timeout value] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]
workspacename跟schemename必须要指定。
例如我的项目:
xcodebuild -workspace RRTuiGuang.xcworkspace -scheme RRTuiGuang -configuration Release
如果 build 成功,会看到 ** BUILD SUCCEEDED ** 字样,且在终端会打印出这次 build 的签名信息,如下:
Signing Identity: “iPhone Developer: xxx(xxxxxx)”
Provisioning Profile: “iOS Team Provisioning Profile: xxx"
该目录下会多出一个 build 文件夹,该目录下有 Release-iphoneos 和 工程名.build 文件,根据我们 build -configuration 配置的参数不同,Release-iphoneos 的文件名会不同。在 Release-iphoneos 文件夹下,有我们需要的xxx.app文件,这样第一步就完成了,但是要安装到真机上,我们需要将该文件导出为ipa文件,使用 xcrun 命令。
PackageApplication新版Xcode不兼容被废弃
xcrun -sdk iphoneos -v PackageApplication ./build/Release-iphoneos/xxx.app -o ~/Desktop/xxx.ipa
xcodebuild archive工程
上面的方法被弃用,相当恶心啊。所以我们还有从头来过,(不要打我)不过下面会介绍最新的打包方式,两句话:
1.生成archive包
// 使用pod管理第三方
xcodebuild archive -workspace 项目名称.xcworkspace -scheme 项目名称 -configuration Release -archivePath archive包存储路径 CODE_SIGN_IDENTITY=证书 PROVISIONING_PROFILE=描述文件UUID
// 未使用pod管理第三方
xcodebuild archive -project 项目名称.xcodeproj -scheme 项目名称 -configuration Release -archivePath archive包存储路径 CODE_SIGN_IDENTITY=证书 PROVISIONING_PROFILE=描述文件UUID
如果项目工程里已经设置CODE_SIGN_IDENTITY证书和PROVISIONING_PROFILE描述文件,在这里就不需要添加了。
2.生成ipa包
xcodebuild -exportArchive -exportFormat ipa文件格式 -archivePath archive包存储路径 -exportPath ipa包存储路径 -exportProvisioningProfile 描述文件名称,同上,在这里就不需要添加了。
如果exportProvisioningProfile描述文件已经设置,
- -archivePath:archive包保存目录;
- CODE_SIGN_IDENTITY:证书(证书名称)
- PROVISIONING_PROFILE:描述文件UUID
- -exportProvisioningProfile:描述文件(描述文件名称)
大功告成!之后我会总结一下,jekens+svn和xctool