iOS 本地自動打包工具

 

 

一、爲何要自動打包工具?python

 

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

 

二、網上有那麼多自動打包工具,我直接下載就好了爲啥還要學習?github

 

沒錯網上有不少打包工具,包括github上也有一些直接從github下載並打包上傳的,可是他們的不必定適合你,首先下載下來要配置各類參數,不會配,還有網上大可能是針對普通項目,可是咱們項目是cocoaPods管理的,編譯的是 xxx.xcworkspace 不是 xxx.xcodeproj 。怎麼辦 , xxx.xcodeproj 自動編譯後就在你項目目錄下會有 xxx.app 可是 xxx.xcworkspace 找不到怎麼辦?怎麼指定目錄 , 這些網上的庫大都沒有的。api

 

三、須要哪些準備工做?xcode

 

首先你得有裝xcode , python3.5 (我裝的版本,其餘版本也行), 待打包的項目。安裝相關軟件,隨便搜索下就能夠了。ruby

 

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

 

xcode控制檯命令app

 

xcode 控制檯命令基本都是以 xcodebuild 開頭的介紹幾個簡單的命令,你們能夠在命令行試試。iphone

 

  • 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

 

# -*- 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,和建立一個文件夾,這裏的示例是針對有使用cocoaPods的項目 , 若是沒有使用 不用建立文件夾 ,命令自行簡化

 

# 清理項目 建立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的佔位符,字符串類型。後面是真正的填充。

 

第三步編譯項目

 

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))

 

而後你如今再編寫個方法,按順序調用就能夠編譯打包了 ,執行完會看到桌面的ipa

 

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官網登陸找好就能找到。

拿到那一串串字符,在變量區加上

 

# 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 帶後面的就能夠執行 ,可是在這裏識別不了命令,必須制定全路徑,怎麼找命令的全路徑呢?終端輸入 which fir

 

發郵件

 

具體發郵件功能看代碼,這裏有幾個變量。我使用的是新浪郵箱發的,smtp服務器 , 若是你是 pop3 請更換,還要在郵箱裏開啓相應的服務

 

from_addr = "xxxx@sina.com"

password = "*****"

smtp_server = "smtp.sina.com"

to_addr = 'aaa@qq.com,bbbb@qq.com'

 

而後發郵件的方法

 

咱們的fir路徑是固定的

 

# 發郵件

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()

 

而後執行順序是這樣的

 

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

相關文章
相關標籤/搜索