iOS 本地自動打包工具

自動打包

1、為什么要自動打包工具?

每修改一個問題,測試都讓你打包一個上傳fir , 你要clean -> 編譯打包 -> 上傳fir -> 通知測試。而且打包速度好慢,太浪費時間了。如果有一個工具能自動的幫你做完上面所有的事情,豈不是快哉?

2、網(wǎng)上有那么多自動打包工具,我直接下載就行了為啥還要學(xué)習(xí)?

沒錯網(wǎng)上有很多打包工具,包括github上也有一些直接從github下載并打包上傳的,但是他們的不一定適合你,首先下載下來要配置各種參數(shù),不會配,還有網(wǎng)上大多是針對普通項目,但是我們項目是cocoaPods管理的,編譯的是 xxx.xcworkspace 不是 xxx.xcodeproj 。怎么辦 , xxx.xcodeproj 自動編譯后就在你項目目錄下會有 xxx.app 但是 xxx.xcworkspace 找不到怎么辦?怎么指定目錄 , 這些網(wǎng)上的庫大都沒有的。

3、需要哪些準備工作?

首先你得有裝xcode , python3.5 (我裝的版本,其他版本也行), 待打包的項目。安裝相關(guān)軟件,隨便搜索下就可以了。

廢話結(jié)束,開始正文。本文介紹的是自動clean本地項目,編譯 打包 上傳fir 郵件通知相關(guān)人員。不涉及從git上下載。原理就是利用python執(zhí)行控制臺命令。對
iOS項目進行打包

xcode控制臺命令

xcode 控制臺命令基本都是以 xcodebuild 開頭的介紹幾個簡單的命令,大家可以在命令行試試。

  • xcodebuild -version 查看xcode的版本號和build的版本號
  • xcodebuild -showsdks 顯示當(dāng)前系統(tǒng)的SDK、及其版本
  • xcodebuild -listcd 到工程目錄下執(zhí)行此命令 顯示target Schemes

沒有使用 cocoaPods 項目的編譯

如果你的項目是普通的項目沒有使用cocoaPods 那么 cd 到工程目錄下直接執(zhí)行 xcodebuild build ,就會自動編譯了 參數(shù)都是默認 默認build release。
你也可以指定 xcodebuild -configuration debug build build的時候會在你工程目錄下生成一個build文件夾,build/Release-iphoneos/xx.app
就是一會打包成ipa需要的文件。 第一次build速度會比較慢,要把編譯環(huán)境拉下來,不要刪除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實現(xiàn)篇

上面只是說了下編譯的原理,下面看下怎么通過python自動處理這些任務(wù) 。

clean、編譯、打包

首先創(chuàng)建一個xxx.py文件,需要你懂點python 語法,不懂就直接copy代碼。不要改tab 。python的語法是嚴格按照tab區(qū)分的。后面我會放上我的代碼,你們改改
變量就可以使用。

首先你需要引入一些外部依賴。設(shè)置編碼為utf-8

# -*- 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

第一步 , 聲明一些變量

# 項目根目錄
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,和創(chuàng)建一個文件夾,這里的示例是針對有使用cocoaPods的項目 , 如果沒有使用 不用創(chuàng)建文件夾 ,命令自行簡化

# 清理項目 創(chuàng)建build目錄
def clean_project_mkdir_build():
    os.system('cd %s;xcodebuild clean' % project_path) # clean 項目
    os.system('cd %s;mkdir build' % project_path) # 創(chuàng)建目錄

%s 是py的占位符,字符串類型。后面是真正的填充。

第三步編譯項目

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 自己查

第四步 打包

# 打包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))

然后你現(xiàn)在再編寫個方法,按順序調(diào)用就可以編譯打包了 ,執(zhí)行完會看到桌面的ipa

def main():
    # 清理并創(chuàng)建build目錄
    clean_project_mkdir_build()
    # 編譯coocaPods項目文件并 執(zhí)行編譯目錄
    build_project()
    # 打包ipa 并制定到桌面
    build_ipa()

執(zhí)行就在最下面直接調(diào)用就行了 main()

上傳fir

我們是把代碼上傳到fir測試的,如果你們用的蒲公英或者其他,請自行搜索。
通過 gem install fir-cli 如果你沒有ruby環(huán)境,自行搜索

安裝完成后,在命令行輸入fir 回車 。會有fir的命令提示。我們上傳fir需要fir的API_TOKEN , 去fir官網(wǎng)登錄找好就能找到。
拿到那一串串字符,在變量區(qū)加上

# firm的api token
fir_api_token = "xxxxxxxxxxxxxxxxxxxxxxxxxx"

然后命令傳入ipa目錄和token就可以上傳了

#上傳
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 帶后面的就可以執(zhí)行 ,但是在這里識別不了命令,必須制定全路徑,怎么找命令的全路徑呢?終端輸入 which fir

發(fā)郵件

具體發(fā)郵件功能看代碼,這里有幾個變量。我使用的是新浪郵箱發(fā)的,smtp服務(wù)器 , 如果你是 pop3 請更換,還要在郵箱里開啟相應(yīng)的服務(wù)

from_addr = "xxxx@sina.com"
password = "*****"
smtp_server = "smtp.sina.com"
to_addr = 'aaa@qq.com,bbbb@qq.com'

然后發(fā)郵件的方法

我們的fir路徑是固定的

# 發(fā)郵件
def send_mail():
    msg = MIMEText('xxx iOS測試項目已經(jīng)打包完畢,請前往 http://fir.im/xxxxx 下載測試!', 'plain', 'utf-8')
    msg['From'] = _format_addr('自動打包系統(tǒng) <%s>' % from_addr)
    msg['To'] = _format_addr('xxx測試人員 <%s>' % 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()

然后執(zhí)行順序是這樣的

def main():
    # 清理并創(chuàng)建build目錄
    clean_project_mkdir_build()
    # 編譯coocaPods項目文件并 執(zhí)行編譯目錄
    build_project()
    # 打包ipa 并制定到桌面
    build_ipa()
    # 上傳fir
    upload_fir()
    # 發(fā)郵件
    send_mail()

# 執(zhí)行
main()

本文重點在自動打包命令上,python代碼感興趣的可以去Python教程 學(xué)習(xí)。
本文代碼已經(jīng)托管在github上:https://github.com/smalldu/autoipa
文章同步放在我的blog上:iOS 本地自動打包工具

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容