1、為什麼要自動打包工具?
每修改一個問題,測試都讓你打包一個上傳fir , 你要clean -> 編譯打包 -> 上傳fir -> 通知測試。而且打包速度好慢,太浪費時間了。如果有一個工具能自動的幫你做完上面所有的事情,豈不是快哉?
2、網上有那麼多自動打包工具,我直接下載就行了為啥還要學習?
沒錯網上有很多打包工具,包括github上也有一些直接從github下載並打包上傳的,但是他們的不一定適合你,首先下載下來要配置各種引數,不會配,還有網上大多是針對普通專案,但是我們專案是cocoaPods管理的,編譯的是 xxx.xcworkspace
不是 xxx.xcodeproj
。怎麼辦 , xxx.xcodeproj
自動編譯後就在你專案目錄下會有 xxx.app
但是 xxx.xcworkspace
找不到怎麼辦?怎麼指定目錄 , 這些網上的庫大都沒有的。
3、需要哪些準備工作?
首先你得有裝xcode
, python3.5
(我裝的版本,其他版本也行), 待打包的專案。安裝相關軟體,隨便搜尋下就可以了。
廢話結束,開始正文。本文介紹的是自動clean本地專案,編譯 打包 上傳fir 郵件通知相關人員。不涉及從git上下載。原理就是利用python
執行控制檯命令。對
iOS專案進行打包
xcode控制檯命令
xcode
控制檯命令基本都是以 xcodebuild
開頭的介紹幾個簡單的命令,大家可以在命令列試試。
xcodebuild -version
檢視xcode的版本號和build的版本號xcodebuild -showsdks
顯示當前系統的SDK、及其版本xcodebuild -list
先cd
到工程目錄下執行此命令 顯示target
Schemes
等
沒有使用 cocoaPods
專案的編譯
如果你的專案是普通的專案沒有使用cocoaPods 那麼 cd 到工程目錄下直接執行 xcodebuild build
,就會自動編譯了 引數都是預設 預設build release。
你也可以指定 xcodebuild -configuration debug build
build的時候會在你工程目錄下生成一個build資料夾,build/Release-iphoneos/xx.app
就是一會打包成ipa需要的檔案。 第一次build速度會比較慢,要把編譯環境拉下來,不要刪除build資料夾,以後build 速度就會變快。
使用了 cocoaPods
專案的編譯
如果不幸你也和我一樣使用了cocoaPods
, 其實也沒啥不幸的 ,只是編譯的時候就比較麻煩了 ,首先還是 cd 到專案目錄 。但是你要指定編譯檔案和 scheme
而且還要指定build後build資料夾的位置,如果位置找不到,後面怎麼自動打包ipa?。
我這裡的命令大概是這樣的:
xcodebuild -workspace xxx.xcworkspace -scheme 你的scheme -configuration debug -derivedDataPath 指定路徑 ONLY_ACTIVE_ARCH=NO
這樣就能正常編譯並把build指定到我們想要去的目錄
打包ipa
打包ipa只要上面路徑對了,打包指定從.app 檔案的路徑 , 打包到你指定地方就行了。
命令:
xcrun -sdk iphoneos PackageApplication -v 這裡填.app的路徑 -o 指定存放ipa路徑/檔名.ipa
python實現篇
上面只是說了下編譯的原理,下面看下怎麼通過python自動處理這些任務 。
clean、編譯、打包
首先建立一個xxx.py檔案,需要你懂點python
語法,不懂就直接copy程式碼。不要改tab
。python的語法是嚴格按照tab
區分的。後面我會放上我的程式碼,你們改改
變數就可以使用。
首先你需要引入一些外部依賴。設定編碼為utf-8
1 2 3 4 5 6 7 8 9 10 |
# -*- coding: utf-8 -*- import os import sys import time import hashlib from email import encoders from email.header import Header from email.mime.text import MIMEText from email.utils import parseaddr, formataddr import smtplib |
第一步 , 宣告一些變數
1 2 3 4 5 6 7 8 |
# 專案根目錄 project_path = "/Users/xx/project" # 編譯成功後.app所在目錄 app_path = "/Users/xx/project/build/Build/Products/Release-iphoneos/xxx.app" # 指定專案下編譯目錄 build_path = "build" # 打包後ipa儲存目錄 targerIPA_parth = "/Users/xx/Desktop" |
第二步,clean,和建立一個資料夾,這裡的示例是針對有使用cocoaPods的專案 , 如果沒有使用 不用建立資料夾 ,命令自行簡化
1 2 3 4 |
# 清理專案 建立build目錄 def clean_project_mkdir_build(): os.system('cd %s;xcodebuild clean' % project_path) # clean 專案 os.system('cd %s;mkdir build' % project_path) # 建立目錄 |
%s
是py的佔位符,字串型別。後面是真正的填充。
第三步編譯專案
1 2 3 4 |
def build_project(): print("build release start") os.system ('cd %s;xcodebuild -list') os.system ('cd %s;xcodebuild -workspace xxx.xcworkspace -scheme xxx -configuration release -derivedDataPath %s ONLY_ACTIVE_ARCH=NO || exit' % (project_path,build_path)) |
不知道scheme
是啥的xcodebuild -list
自己查
第四步 打包
1 2 3 4 5 |
# 打包ipa 並且儲存在桌面 def build_ipa(): global ipa_filename ipa_filename = time.strftime('yourproject_%Y-%m-%d-%H-%M-%S.ipa',time.localtime(time.time())) os.system ('xcrun -sdk iphoneos PackageApplication -v %s -o %s/%s' % (app_path,targerIPA_parth,ipa_filename)) |
然後你現在再編寫個方法,按順序呼叫就可以編譯打包了 ,執行完會看到桌面的ipa
1 2 3 4 5 6 7 |
def main(): # 清理並建立build目錄 clean_project_mkdir_build() # 編譯coocaPods專案檔案並 執行編譯目錄 build_project() # 打包ipa 並制定到桌面 build_ipa() |
執行就在最下面直接呼叫就行了 main()
上傳fir
我們是把程式碼上傳到fir測試的,如果你們用的蒲公英或者其他,請自行搜尋。
通過 gem install fir-cli
如果你沒有ruby環境,自行搜尋
安裝完成後,在命令列輸入fir 回車 。會有fir的命令提示。我們上傳fir需要fir的API_TOKEN , 去fir官網登入找好就能找到。
拿到那一串串字元,在變數區加上
1 2 |
# firm的api token fir_api_token = "xxxxxxxxxxxxxxxxxxxxxxxxxx" |
然後命令傳入ipa目錄和token就可以上傳了
1 2 3 4 5 6 7 8 |
#上傳 def upload_fir(): if os.path.exists("%s/%s" % (targerIPA_parth,ipa_filename)): print('watting...') # 直接使用fir 有問題 這裡使用了絕對地址 在終端通過 which fir 獲得 ret = os.system("/usr/local/bin/fir p '%s/%s' -T '%s'" % (targerIPA_parth,ipa_filename,fir_api_token)) else: print("沒有找到ipa檔案") |
這裡也有遇到一個=坑,就是在終端直接fir 帶後面的就可以執行 ,但是在這裡識別不了命令,必須制定全路徑,怎麼找命令的全路徑呢?終端輸入 which fir
發郵件
具體發郵件功能看程式碼,這裡有幾個變數。我使用的是新浪郵箱發的,smtp伺服器 , 如果你是 pop3 請更換,還要在郵箱裡開啟相應的服務
1 2 3 4 |
from_addr = "xxxx@sina.com" password = "*****" smtp_server = "smtp.sina.com" to_addr = 'aaa@qq.com,bbbb@qq.com' |
然後發郵件的方法
我們的fir路徑是固定的
1 2 3 4 5 6 7 8 9 10 11 |
# 發郵件 def send_mail(): msg = MIMEText('xxx iOS測試專案已經打包完畢,請前往 http://fir.im/xxxxx 下載測試!', 'plain', 'utf-8') msg['From'] = _format_addr('自動打包系統 ' % from_addr) msg['To'] = _format_addr('xxx測試人員 ' % to_addr) msg['Subject'] = Header('xxx iOS客戶端打包程式', 'utf-8').encode() server = smtplib.SMTP(smtp_server, 25) server.set_debuglevel(1) server.login(from_addr, password) server.sendmail(from_addr, [to_addr], msg.as_string()) server.quit() |
然後執行順序是這樣的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def main(): # 清理並建立build目錄 clean_project_mkdir_build() # 編譯coocaPods專案檔案並 執行編譯目錄 build_project() # 打包ipa 並制定到桌面 build_ipa() # 上傳fir upload_fir() # 發郵件 send_mail() # 執行 main() |
本文重點在自動打包命令上,python程式碼感興趣的可以去Python教程 學習。
本文程式碼已經託管在github上:https://github.com/smalldu/autoipa
文章同步放在我的blog上:iOS 本地自動打包工具