前言
作为iOS客户端开发的小哥们,一定都有过一天给测试人员、产品组打包N次的经历。如果每次都手动打包的话,不仅浪费了开发人员的时间,让测试小姐姐煎熬等待也是件不厚道的事情。
所以自动化打包在此时就显得尤为重要了。有了自动化打包工具,开发小哥只需要运行打包工具,剩下的事情就交给自动化打包工具就好了。工具会自动打包,并将ipa包上传至fir,如果有需要还可以让工具自动发送消息通知测试小姐姐可以测试了。O(∩_∩)O哈哈哈~
基本命令
本次将使用 xcodebuild
:命令, 生成Archive
、导出ipa
。
(ps: 据说还有其他命令也可以实现,就让其他小伙伴来介绍吧。)
使用xcodebuild
命令有两个步骤:
第一步:archive
:编译打包成Archive 和Xcode操作「Product -> Archive」一致
xcodebuild archive -workspace xxx.xcworkspace -scheme xxx -configuration Release -archivePath ${ARCHIVE_PATH} CONFIGURATION_BUILD_DIR=${BUILD_DIR}
参数说明
-workspace
:指定工作空间文件xxx.xcworkspace
-scheme
: 指定构建工程名称
-configuartion
: [Debug/Release]可选项,选择Debug或者Release构建
-archivePath
: 保存生成.xcarchive包路径
CONFIGURATION_BUILD_DIR
: build时的文件路径(主要包含.a文件、XXX.app文件和XXX.app.dSYM文件)如果不需要用到XXX.app.dSYM文件中的二进制文件(有些第三方崩溃统计需要用到此文件),可以不加此项。
第二步:export
:将生成的xxx.xcarchive文件导出成xxx.ipa。和Xcode操作「Organizer -> Archives -> Export」一致
xcodebuild -exportArchive -archivePath ${ARCHIVE_PATH} -exportOptionsPlist ${EXPORT_OPTIONS_PLIST_PATH} -exportPath ${EXPORT_DIR}
参数说明
-archivePath
: 第一步中生成xxx.xcarchive文件的路径
-exportOptionsPlist
: 导出过程中需要的配置文件路径
-exportPath
: 导出ipa的保存目录
特别说明
第二步中的配置文件特别重要,是你打包为测试包或者发布版本的关键。稳妥起见,请手动打包一次,从生成的目录中获取
以上两步就是自动化打包的核心,如果以上命令中有不明白或有误的地方,可通过命令xcodebuild -usage
查看详细信息。
如何使用
因为目前正在学习Golang,所以使用Golang来完成自动化打包工具的开发,本次打包的目标为测试版本,需要发布版本的小伙伴可根据原理执行修改。
1、创建项目
首先创建一个Golang项目,添加main.go文件,因项目简单,所以所有代码均写在main.go文件中。
2、配置文件
为了以后可以打包不同的项目,所以讲项目中需要用到的目录等写为一个配置文件,便于修改。
创建config.json
文件,配置文件名称可以随便起名。
{
"scheme":"构建的工程名称", // eg.我的项目叫TShop
"path":"工程根目录路径", // eg. "~/Desktop/TShop_SVN"
"workspace":"工作空间文件名", // 即项目中.xcworkspace后缀名文件的名称
"archPath":"保存Archive文件的路径+Archive文件名", // eg. "~/Desktop/autoArchive/TShop"
"exportPath":"导出ipa文件的路径",
"config": "第二步中需要用到的配置文件的路径",
"apiToken":"你注册的fir的Api Token"
}
3、在main.go中解析配置json文件
在main.go中创建type
type buildInfo struct {
Path string `json:"path"`
Workspace string `json:"workspace"`
Scheme string `json:"scheme"`
ArchPath string `json:"archPath"`
ExportPath string `json:"exportPath"`
Config string `json:"config"`
ApiToken string `json:"apiToken"`
}
在main函数中解析json
func main() {
file := "config.json" // 应改为你的配置文件的路径
content, err := ioutil.ReadFile(file)
if err != nil {
panic(err.Error())
}
var info buildInfo
err = json.Unmarshal(content, &info)
if err != nil {
panic(err.Error())
}
}
4、Archive
创建Archive函数来执行第一步的命令
func Archive(info buildInfo) {
err := os.Chdir(info.Path)
if err != nil {
panic(err.Error())
}
workspace := info.Workspace + ".xcworkspace"
archCommand := exec.Command("xcodebuild", "archive", "-workspace", workspace, "-scheme", info.Scheme, "-archivePath", info.ArchPath)
archCommand.Stdout = os.Stdout
err = archCommand.Run()
if err != nil {
panic(err.Error())
}
}
5、Export
func Export(info buildInfo) {
arch := info.ArchPath + ".xcarchive"
export := exec.Command("xcodebuild", "-exportArchive", "-archivePath", arch, "-exportOptionsPlist", info.Config, "-exportPath", info.ExportPath)
export.Stdout = os.Stdout
err := export.Run()
if err != nil {
panic(err.Error())
}
}
在main函数末尾调用Archive(info)和Export(info)并运行即可自动打包生成ipa文件。
6、上传至fir
使用fir-cli上传ipa,需要下载安装fir-cli,请自行查看git,按说明安装。
上传命令 fir publish APP_FILE_PATH -T API_TOKEN
参数说明
APP_FILE_PATH
: 生成的.ipa文件的路径
-T
: fir账号的API Token
(publish的其他参数请查看文档)
在main.go中创建Upload函数
func Upload(info buildInfo) {
ipaPath := info.ExportPath + info.Scheme + ".ipa"
upload := exec.Command("fir", "publish", ipaPath, "-T", info.ApiToken)
upload.Stdout = os.Stdout
err := upload.Run()
if err != nil {
panic(err.Error())
}
}
然后在main函数的末尾调用Upload(info),即可将生成的ipa上传至fir。
最后的main函数
func main() {
file := "config.json"
content, err := ioutil.ReadFile(file)
if err != nil {
panic(err.Error())
}
var info buildInfo
err = json.Unmarshal(content, &info)
if err != nil {
panic(err.Error())
}
Archive(info)
Export(info)
Upload(info)
}
如果配置无误,在命令行工具中输入go run main.go
即可完成自动打包并上传fir的全部流程。
也可以使用go命令将该工具生成为可执行文件。以后需要打测试包的时候,双击自动化打包工具就完成了所有流程,是不是很方便呢?
O(∩_∩)O
完
有疑问加站长微信联系(非本文作者)