背景
我们在开发过程中总免不了需要经历发测、上传等环节。这开发环节中,我们需要打不同环境的包,上传对应的分发后台(例如”蒲公英“、TestFlight、iTunes Connect)等。每次的手动打包的过程中,我们都要选择对应的环境、对应打包的证书、正确的target等工作。万一上述步骤哪一步选错了,轻者得重新走一遍上述的流程,更严重点还有可能会把测试服的数据传到正式服去了。仔细想想后患无穷。有没有一种方法可以在设置好一系列的任务流程后,只需要一句代码就可以自动帮我们完成上面提及的一些列操作。既减少我们手动操作的同时,还能减少选择环境证书导致错误的方法呢?有!fastlane就能帮到你。
fastlane
fastlane是一个自动化构建工具,主要包含测试、打包、发布等功能,它内部是由ruby实现的,是一款自动化非常高的脚本工具。
安装
mac自带的ruby,需要 sudo权限
sudo gem install fastlane
初始化
在项目根目录(通俗一点就是跟你.xcworkspace、Podfile文件同级的t地方)下,初始化Fastlane:
fastlane init

在初始化完成后我们看到在根目录下生成了一个fastlane的文件夹还有一个Gemfile文件

-fastlane
-Fastfile(核心文件,主要用于 命令行调用和处理具体的流程,lane相对于一个方法或者函数)
-Appfile(存储有关开发者账号相关信息)
-Gemfile(Gemfile是我们创建的一个用于描述gem之间依赖的文件。gem是一堆Ruby代码的集合,它能够为我们提供调用)
至此我们完成了第一步,fastlans的初始化。打开Fastfile我们就可以看见fastlane的核心文件了。
default_platform(:ios)
platform :ios do
desc "Description of what the lane does"
lane :custom_lane do
# add actions here: https://docs.fastlane.tools/actions
end
end
我们只需要在命令行敲fastlane custom_lane就可以执行这个自定义的任务。但当然由于我们啥都没设置,他并不会有任何效果。
Fastfile文件编写
和我们iOS的ViewController一样,fastlane也是有生命周期的。fastlane的生命周期为
| 执行顺序 | 方法名 | 说明 |
|---|---|---|
| 1 | before_all | 在执行 lane 之前只执行一次 |
| 2 | before_each | 每次执行 lane 之前都会执行一次 |
| 3 | lane | 自定义的任务 |
| 4 | after_each | 每次执行 lane 之后都会执行一次 |
| 5 | after_all | 在执行 lane 成功结束之后执行一次 |
| 6 | error | 在执行上述情况任意环境报错都会中止并执行一次 |
lane
lane是fastfile中的方法定义标签,可以理解为函数。fastlane 都是基于ruby,所以fastfile中也是使用ruby语法的。
定义一个简单的无参lane
lane :noParam_lane
puts "这是一个无参数的lane"
end
调用方法fastlane noParam_lane
定义一个带参的lane,在fastfile中option类似于一个字典集。我们可以通过 option[:configuration] 取其中value
lane :param_lane do |option|
param = option[:param]
puts "这是一个有参数的lane"
puts param
end
调用方法param_lane(param: '我是参数')
Action
除开我们自定义fastfile中的方法,fastlane还提供了很多已经写好的独立的方法库,也就是Actions。
常见的action可以查阅Actions 或调用fastlane代码fastlane actions
举例
下面我们举一个简单的打包例子
APP_NAME = "XXX"
SCHEME = "XXX"
platform :ios do
#在执行lane前先跑一遍cocoapods
before_all do
cocoapods
end
#debug包
lane :iosDebug do
package(configuration: "Debug",method:"development")
end
#release包
lane :iosRelease do
package(configuration: "Release",method:"ad-hoc")
end
#发布包
lane :iosAppStore do
package(configuration: "Release",method:"app-store"")
end
#打包函数
lane :package do |option|
#打包
gym(
scheme: "#{SCHEME}",
export_method: option[:method],
configuration: option[:configuration],
include_symbols: true,
include_bitcode: false,
export_xcargs: "-allowProvisioningUpdates"
)
end
首先我们在Fastfile中全局定义了几个参数分别用于存储应用名、SCHEME等公用参数。在上一章节中我们说过fastlane的生命周期中有一个before_all(在执行 lane 之前只执行一次),我们在这个方法中先更新了一遍cocoaPods。然后定义了3个lane,分别对应我们开发过程中测试服发测、正式服发测、以及上传appstore的3种打包流程。在流程中通过对configuration 和method 的传参达到配置不同打包环境的效果。
switch lane
我们可以从代码中看到,iosDebug、iosRelease、iosAppStore 3个lane最后都调用了一个公用的lane package。这种在一个lane中调用另一个lane的使用方式我们把它命名为switch lane
gym
gym其实是actionbuild_app的别名。按照他的官方的说法,使用gym来构建ipa文件,会比其他构建工具还要快30%(真香)。
gym的参数有非常多取几个比较常用的来讲一下
| 参数名 | 解释 |默认值| |: --------: | :-----: | :----: | | workspace | workspace文件的路径| | | project | project文件的路径| | | scheme | 要打包项目的scheme| | | clean | 打包前要不要clean一下(最好还是clean一下吧,这个默认值是不clean的)|false | | output_directory | 打包后导出的目录|*(根目录) | | output_name | 导出ipa的名字| | | configuration | 打包的配置| ”Release”| | include_symbols | ipa文件应包含符号表吗| | | include_bitcode | ipa文件应包含include_bitcode吗| | | export_method | 导出有效值的方法,有效值包括:app-store, ad-hoc, package, enterprise, development, developer-id| | 其他详细的不常用的就不复制粘贴了大家可以看build_app这里 。
执行打包
有了上面对打包方法的封装,我们只需要根据不同的打包需求。测试服发测调用iosDebug;正式服发测调用iosRelease;打appstore包调用iosAppStore 即可获得我们想要的不同环境的包了。
上传蒲公英
我们在发测过程中还有上传到软件分发后台的操作,这个功能fastlane同样帮我们封装成插件了。我们只需要在在终端中,输入以下命令,即可安装蒲公英的 fastlane 插件。
fastlane add_plugin pgyer
安装完毕后,我们在Fastfile里需要上传到蒲公英的lane中加入相应的命令即可在得到ipa包后直接上传蒲公英
#debug包
lane :iosDebug do
package(configuration: "Debug",method:"development")
pgyer(api_key: "7f15xxxxxxxxxxxxxxxxxx141", user_key: "4a5bcxxxxxxxxxxxxxxx3a9e")
end
#release包
lane :iosRelease do
package(configuration: "Release",method:"ad-hoc")
pgyer(api_key: "7f15xxxxxxxxxxxxxxxxxx141", user_key: "4a5bcxxxxxxxxxxxxxxx3a9e")
end
PS:api_key和user_key在蒲公英的后台获取。
最后再调用一下lane:

拓展
有一个振奋人心的消息是:fastlane支持Swift编写了!!!Swift成为世界最好的语言指日可待!其实用法跟ruby版本类似,我也根据说明文档写了一下,如果是熟悉Swift代码编写的同行应该很容易上手。但其实这个fastlane.swift只是基于ruby的封装,并不是原生的Swift。但还是足以让iOS开发者兴奋的。不过局限于当前的bate版本是不支持插件的,因此像上文提及的上传到蒲公英这些操作fastlane.swift还无法实现。所以实用性还是不能跟ruby原生版本相提并论的。或许将来的某天fastlane.swift正式版发布可以解决这一问题,到时候我再补充Swift版本。Fastlane的开发者们加油吧!期待正式版发布!
参考资料: