前言
作為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
完