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

相关文章
相关标签/搜索