前篇文章介绍Android多环境编译打包。
本篇介绍如何使用fastlane构建多版本应用。
安装
工具的起源本身是专门针对 iOS 项目,因此目前依赖于 macOS 10.9 以上系统,Ruby 是一个众所周知的轮子发明者,很多知名的工具都是它开发的,fastlane 也不例外。以下是依赖环境:
- macOS 10.9+
- Ruby 2.0+ (推荐 rvm 或 rbenv 安装)
- Xcode + command line tools
安装最新的Xcode命令行工具
xcode-select --install
安装fastlane
# Using RubyGems
sudo gem install fastlane -NV
# Alternatively using Homebrew
brew cask install fastlane
使用
切换到你的iOS工程目录,在目录下执行:
fastlane init
初始化过程会有选项提示,根据自己的情况选择即可,我一般选择“Manual setup”。
完成后会看到目录下多了一个Gemfile,还有一个fastlane文件夹,里面包含两个文件:AppFile和Fastfile。
先将注意力集中在Fastfile中。新创建的文件内容如下:
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
我们需要编写的内容都在platform :ios do
到末行end
之间。
- lane:定义一个名为
custom_lane
的任务方法。任务可以定义多个并互相调用,支持参数。 - desc:任务描述
我们的目标是构建应用,先来创建一个最简单的任务:
platform :ios do
desc "构建beta版本"
lane :beta do
# add actions here: https://docs.fastlane.tools/actions
build_app(scheme: "myapp",
workspace: "myapp.xcworkspace",
export_method: "development",
include_bitcode: true)
end
end
执行命令:fastlane beta
编译结束后,你就会在根目录看到已经编译好的ipa文件:MyApp.ipa
build_app
是一个action,是build_ios_app
的别名,常用的参数配置如下:
-
workspace
:xcworkspace工程文件路径 -
project
:xcodeproj工程文件路径,如果是workspace工程不需要填这个 -
scheme
:指定scheme -
clean
:编译前是否清理 -
output_directory
:ipa文件保存路径 -
output_name
:自定义ipa文件名 -
export_method
:支持app-store, ad-hoc, package, enterprise, development, developer-id -
include_bitcode
:是否开启include_bitcode选项
更详细的参数列表请看文档:https://docs.fastlane.tools/actions/build_app/#parameters
除了build_app
之外,falstlane还支持非常多的action,更多action查看文档https://docs.fastlane.tools/actions
下面列举几种:
-
increment_version_number
:自动更新版本号 -
update_app_identifier
:更新bundleID -
update_info_plist
:更新info.plist,不过只能更新bundle id和Display Name。不要用此方法更新bundle id,而是建议用update_app_identifier
更新。 -
update_plist
:更新plist文件中,可以修改plist中的键值对。
多版本构建
我希望通过fastlane在本地快速构建开发、生产环境不同版本的App,需求点依然是每个版本的bundle id、接口地址、应用名称、sdk secret key不一样,最终只通过命令完成一键构建。
我们先定一个任务(lane),用来修改配置
desc "修改项目配置"
desc "参数 prod 判断是否为生产版本"
lane :set_app_mode do |options|
prod = options[:prod] || false
# bundle id
app_id_suffix = prod ? "prod" : "dev"
# 应用名称
app_name_suffix = prod ? "" : "测试版"
# app center应用统计sdk的secret key,分环境
app_center_dev_secret = "aaaaaa"
app_center_prod_secret = "bbbbbb"
app_center_secret = prod ? app_center_prod_secret : app_center_dev_secret
# 接口地址
backend_dev = "https://dev.example.com"
backend_prod = "https://prod.example.com"
backend = prod ? backend_prod : backend_dev
# 更新bundle id
update_app_identifier(
xcodeproj: "myapp.xcodeproj",
plist_path: "myapp/Info.plist",
app_identifier: "com.example.myapp.#{app_id_suffix}"
)
# 更新应用名称字段display_name
update_info_plist(
xcodeproj: "myapp.xcodeproj",
plist_path: "myapp/Info.plist",
display_name: "MyApp#{app_name_suffix}"
)
update_plist(
plist_path: "myapp/Config.plist",
block: proc do |plist|
plist[:appSecret] = app_center_secret
plist[:backend] = backend
end
)
end
有了这个方法,我们可以轻松得通过fastlane命令来切换环境配置
# 切换到生产环境
fastlane set_app_mode prod:true
接着我们编写一个编译任务
desc "编译任务"
lane :build do |options|
prod = options[:prod] || false
suffix = prod ? "prod" : "dev"
set_app_mode(prod: prod)
build_app(
scheme: "myapp",
workspace: "myapp.xcworkspace",
include_bitcode: true,
export_method: prod ? "ad-hoc" : "development",
output_directory: "./build",
output_name: "myapp_#{suffix}.ipa"
)
# 重置回开发版配置。日常开发使用的就是开发版配置,这里只是置到日常状态
set_app_mode(prod: false)
end
desc "编译beta版本"
lane :beta do
build(prod: false)
end
desc "编译release版本"
lane :release do
build(prod: true)
end
这里就实现了轻松编译两个版本的命令
#编译生产环境ipa,保存路径 ./build/myapp_prod.ipa
fastlane release
#编译开发环境ipa,保存路径 ./build/myapp_dev.ipa
fastlane beta
实现分发
fastlane还有个很好用的插件机制,官方还提供了个可用的插件列表https://docs.fastlane.tools/plugins/available-plugins/
我app分发用的fir.im,当然也可以使用蒲公英。他们在fastlane中都有对应的插件:fir
和 pgyer
首先引入插件,执行
fastlane add_plugin fir
如果你之前没有装过插件,它会在fastlane文件夹中创建一个Pluginfile文件,内容如下:
# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!
gem 'fastlane-plugin-firim'
好了,这样插件就装好了,接着是使用,直接定义两个任务
desc "编译beta版本并上传至fir.im"
lane :beta_fir do
beta
firim(firim_api_token: ENV["FIR_TOKEN"])
end
desc "编译release版本并上传至fir.im"
lane :release_fir do
release
firim(firim_api_token: ENV["FIR_TOKEN"])
end
这样就非常方便的打包和发布不同版本的安装包了。
# 编译beta版本并上传至fir.im
fastlane beta_fir
# 编译release版本并上传至fir.im
fastlane release_fir
推荐写的非常详细的关于fastlane的博客:
Fastlane - iOS 和 Android 的自动化构建工具
深入浅出 Fastlane 一看你就懂