Fastlane 是一套自动化打包工具,通过配置文件组合不同的工具实现自动化的打包发布流程,极大地节省了应用打包发布流程的时间
# 安装
通过 Homebrew 安装 Fastlane
brew install fastlane
通过 RubyGems 安装 Fastlane
sudo gem install fastlane -NV
# 使用
# 初始化
进入工程根目录,执行下面的指令
fastlane init
运行后按照提示操作完成后会在根目录下创建下面的文件
Root
├── fastlane
│ ├── Appfile
│ └── Fastfile
└── Gemfile
2
3
4
5
- Gemfile - Ruby 的依赖管理文件,用来配置 fastlane 用到的三方组件如 CocoaPods
- Appfile - 记录项目的关键信息,如包名、Apple ID、Team ID 等
- Fastfile - 管理 lane 的文件,我们所有的操作都在这个文件中配置
# 配置
我们在工程目录下初始化 fastlane 后,需要根据需求来配置 Fastfile 文件完成自动化打包的操作,其中最重要的就是 lane 与 action。简单来说 lane 可以看做一个函数,里面包含打包所需要的操作,每个操作都可以看做一个 action,在执行时 fastlane 会依次调用 lane 中配置的 action 来完成打包等操作。
lane :debug do
# action1
# action2
# ...
end
2
3
4
5
上面是一个简单的 lane 的结构,其中 :debug 是 lane 的名字,我们可以根据需要进行定义,一个 Fastfile 中可以包含多个这样的 lane,运行时通过名字来区分。
# 执行
当我们配置好 Fastfile 后就可以通过在工程目录下执行 fastlane [lane名称] 来运行指定的 lane 打包。例如上面的示例结构我们可以通过下面的脚本执行
fastlane debug
# Lane
# 参数传递
在执行 lane 时我们还可以通过指令来传递参数
# fastlane [lane] key1:value1 key2:value2
fastlane debug version:1.0.0 cocoapods:true
2
在 lane 中我们通过 options 来接收使用传入的参数
lane :debug do |options|
# options[:key]
version = options[:version] # 1.0.0
if options[:cocoapods]
# 只有 cocoapods 为 true 时才会执行这里
...
end
end
2
3
4
5
6
7
8
# 调用
跟函数之间的调用类似,一个 lane 可以调用其他的 lane。
lane :release do |options|
build(release: true) # 调用 build 并传入参数
end
lane :debug do |options|
build # 调用 build 默认无参数
end
lane :build do |options|
# 用指定的方式编译 app
build_ios_app(scheme: (options[:release] ? "Release" : "Debug"))
end
2
3
4
5
6
7
8
9
10
11
12
# 返回值
lane 中最后一行代码的结果会被作为返回值,并且在一个 lane 中我们可以调用其他的 lane
lane :debug do |options|
result = add(value: 1) # result 值为 2
end
lane :add do |options|
options[:value] + 1 # 结果会作为返回值返回
end
2
3
4
5
6
7
# before_all 与 before_each
before_all 会在 lane 执行前执行一次
before_all do |lane, options|
# ...
end
2
3
before_each 会在任意 lane 执行前执行。与 before_all 只执行一次不同,如果在一个 lane 中多次调用了其他的 lane,则其他的 lane 执行前都会执行 before_each 。
before_each do |lane, options|
# ...
end
2
3
before_all 会先于 before_each 执行且仅执行一次,许多通用操作如从 git 拉取代码等可以放在 before_all 或 before_each 中
# after_all 与 after_each
after_all 会在 lane 执行完后执行一次
after_all do |lane, options|
# ...
end
2
3
after_each 会在任意 lane 执行完后执行。同样如果在一个 lane 中多次调用了其他的 lane,则其他的 lane 执行完后都会执行 after_each 。
after_each do |lane, options|
# ...
end
2
3
after_all 会在 after_each 执行完后执行且仅执行一次,许多通用操作如发送打包成功的通知等可以放在 after_all 或 after_each 中。
注意
如果执行过程中出现错误则会退出并执行 error, after_all 与 after_each 将不会执行
# error
error 会在 lane 执行出错后执行,在这里可以进行异常处理
error do |lane, exception, options|
# ...
end
2
3
# Action
除了通过 Ruby 代码在自定义 lane 中实现各种功能,fastlane 已经内置了许多写好的独立方法库也就是 action。每一个 action 都是一个 Ruby 脚本,它们是 fastlane 的最小执行单元。这些 action 基本上已经涵盖了打包过程中的各项操作。下面是 iOS 打包中几个常用 action
# cocoapods
cocoapods 会帮我们执行 pod install ,如果工程中使用了 CocoaPods 管理三方库会经常用到。使用 cocoapods 前需要在 Gemfile 中添加
gem "cocoapods"
在 lane 中使用时直接调用
lane :debug do
cocoapods # 执行 pod install
end
2
3
# gym
gym 可以根据配置参数编译 iOS 应用并生成 ipa 包。下面是 gym 中的常用参数
| 参数名 | 描述 | 默认值 |
|---|---|---|
| workspace | workspace 文件路径,使用 cocoapods 后需要使用 | |
| project | project 文件路径,若有 workspace 此项可忽略 | |
| clean | 是否在编译前 clean 工程 | false |
| configuration | 编译设置,Release、Debug、自定义 | |
| export_method | 包输出类型 app-store、ad-hoc、package、enterprise、development | |
| output_directory | 包输出路径 | |
| output_name | 包名称 | |
| include_symbols | 是否集成调试符号,若为 false 则会单独生成符号文件 | |
| include_bitcode | 是否开启 bitcode |
lane :debug do
# ...
gym(
workspace: "app.xcworkspace",
scheme: "app",
# 打包前clean
clean: true,
# Release、Debug、自定义
configuration: "Release",
# app-store, ad-hoc, package, enterprise, development
export_method: "ad-hoc",
# 文件输出路径
output_directory: "/Users/user/Desktop/",
# ipa名称
output_name: "app.ipa",
# 是否包含调试符号
include_symbols: true,
# 是否开启bitcode
include_bitcode: false,
)
# ...
end
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Plugin
除了 fastlane 内置的 action,我们还可以通过安装插件的方式引入第三方的 action 来实现更强大的功能。要安装插件只需要在 fastlane 所在目录运行下面的脚本
fastlane add_plugin [插件名]
首次安装插件会生成 Pluginfile 文件,里面包含了我们安装的所有三方依赖,同时会在 Gemfile 中添加
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)
2
之后就可以在 lane 中使用这个 action 了
# 上传至 fir.im
fir.im 是一个常用的 app 分发平台,它提供了 fastlane 插件 fir_cli 可以自动将 app 上传
# 安装
fastlane add_plugin fir_cli
# 参数
| 参数名 | 描述 | 默认值 |
|---|---|---|
| api_token | 注册账号后获得 token | |
| changelog | 设置更新日志 | |
| skip_update_icon | 跳过图标更新,使用上次的图标 | false |
| open | 是否开放所有人下载 | true |
| password | 设置下载密码 |
更多参数前往 fir_cli 查看
# 使用
lane :debug do
# ...
fir_cli(
api_token: ".....",
changelog: "测试更新",
skip_update_icon: true,
open: false,
password: "123456",
)
end
2
3
4
5
6
7
8
9
10
# 上传到蒲公英
蒲公英是常用的 app 分发平台,它提供了 fastlane 插件 pgyer 可以自动将 app 上传
# 安装
fastlane add_plugin pgyer
# 参数
| 参数名 | 描述 | 默认值 |
|---|---|---|
| api_key | 注册账号后获得 | 必填 |
| user_key | 注册账号后获得 | 必填 |
| update_description | 设置更新描述 | |
| password | 设置下载密码 | |
| install_type | 下载类型,1 - 公开安装,2 - 密码安装,3 - 邀请安装 | 1 |
# 使用
lane :debug do
# ...
pgyer(
api_key: "...",
user_key: "...",
password: "123456",
install_type: "2",
update_description: "全新的版本"
)
end
2
3
4
5
6
7
8
9
10