什么是Fastlane?
官方自己的定义是这样的:
fastlane is a tool for iOS, Mac, and Android developers to automate tedious tasks like generating screenshots, dealing with provisioning profiles, and releasing your application.
从这里我们可以看出,fastlane针对的developers主要是 iOS, Mac, and Android。目的在于替代完成一切 没有技术含量的、乏味的工作。简单列举了比如screenshot,provisioning profiles,deliver。
我们第一次接触fastlane或者之前从来没有使用过CLI工具的人,对于上边的概念描述只能知道他的功能,但是不知道fastlane到底是哪个类型的工具,怎么实现上边功能。 关于这一点,我在阅读 Wang Hailong 的文章得到了很简练的答案,摘录如下
fastlane命令是一个流程控制的命令行工具(CLI),通过内部集成action和第三方的action完成一系列控制流程。运行fastlane命令行工具,会读取当前目录或者./fastlane目录下的Fastfile配置文件。
在Fastfile中:
action => Fastlane中的每一条命令都是一个扩展(action),上面提到的deliver,sigh之类的工具本身是CLI,但是在Fastlane中内嵌了对他们支持的action
lane => Fastlane中流程的合集,每一个动作即可以是action,也可以是其他的lane。语法和ruby中的rake非常像
一个简单的发布流程:
lane :deploy do
# 执行 pod instasll
cocoapods
# 执行 carthage bootstrap
carthage
# 增加build版本号
increment_build_number
# 编译代码
gym
# 发布到Apple Store
deliver(force: true)
end
安装
搞了半小天和在同事的帮助下终于安装上了,也把在安装时候遇到的一些问题分享给大家,看完下面相信大家,很快就会搞定的。
首先:
fastlane安装的方式有三种,分别是Homebrew、Installer Script,Rubygems。 这里需要注意的是,不管选择哪种方式,你都要安装Ruby。
我使用的是rubygems
1.Ruby必须在2.0以上版本
2.macOS 10.9以上系统
3.Xcode 7.3.1 以上版本
4.拥有一个付费的苹果开发者账号
其他:#
安装Ruby/Rubygems,这里注意你在下来一个Ruby版本之后,之前的Ruby也是存在的,所以你需要通过rvm use XXXX --default指定你要使用哪一个Ruby版本,具体可以参考这篇文章《MAC机中安装RUBY环境》
配置环境
更新ruby版本,安装rvm
curl -L get.rvm.io | bash -s stable # 安装
rvm -v # 测试是否安装正常
rvm list known # 列出已知ruby版本
rvm install ruby-xxxxx # 安装一个最新ruby版本 注:此处xxxxx为list中的最新版本号
如果报错的话
brew install openssl
reinstall|install ruby-xxxxx # 注意修改xxxxxx
以上所需的ruby环境基本配置好了
2.打开终端,选择ruby 源
#查看gem源
gem sources
# 删除默认的gem源
gem sources --remove https://ruby.taobao.org/
# 增加rubygems作为gem源
gem sources --a https://rubygems.org/
# 查看当前的gem源
gem sources
*** CURRENT SOURCES ***
https://rubygems.org/
# 清空源缓存
gem sources -c
# 更新源缓存
gem sources -u
安装Fastlane
1.安装xcode-select
xcode-select --install
# 如果 Xcode CLT 已经安装,则会报如下错误
# command line tools are already installed, use "Software Update" to install updates.
# 如果未安装,终端会开始安装 CLT
2.安装fastlane
sudo gem install fastlane --verbose
# 如果报错:ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/commander
sudo gem install -n /usr/local/bin fastlane
# 等待着安装完毕....coffee or tea
# 安装结束后,查看版本(2016.9.26我的版本是1.104.0)
fastlane --version
# 实际上目前安装的fastlane并不是最新版本,还需要更新,怎么更新呢,看下面
# cd到项目文件夹
cd xxxxx
fastlane init
# 需要按照提示输入 AppID以及密码, 这个是你项目的开发者帐号,下边要输入项目的bundleIdentifier,然后出现了提示
########################################################################
# fastlane 1.104.0 is available. You are on 1.103.0.
# It is recommended to use the latest version.
# Update using 'sudo gem update fastlane'.
#######################################################################
# 更新最新版本
sudo gem install -n /usr/local/bin/ fastlane --version1.104.0
# 如果报错 Could not find a valid gem 'fastlane' (= 1.66.0) in any repository , 那么更换一个ruby源,详见步骤2
# 继续更新最新版本
sudo gem install -n /usr/local/bin/ fastlane --version1.104.0
# 1.104.0成功安装!
接着
确保Xcode Command Line Tools 安装了最新版
`xcode-select --install`
如果你单独安装过ruby(如果你能看得懂这句),去掉sudo。如果使用系统自带的ruby,需要sudo权限
sudo gem install fastlane`
提示安装成功,恭喜你,你已经成功了一半。
初始化
cd 到项目目录中
fastlane init
# 注意:如果你看到一个 “permission denied” 错误,你可能要在命令前加上 sudo。
接着
请输入 App Identifier (com.krausefx.app):
请输入一个唯一的 app ID。请记住这个 ID,因为后面你还会用到它! 你的 Apple ID ([email protected]):
请输入你的 Apple ID 是否创建 deliver 命令,即上传 app 屏幕截图、app 元数据和 app 更新到 App 商店或者苹果的 TestFlight?(y/n)
输入 n 是否创建 snapshot 命令,它会自动获取 app 在所有语言和设备类型上的屏幕截图?(y/n)
输入 y 是否使用 sigh 命令,它会维护和下载 app 的 provisioning profile?(y/n)
输入 y 可选项:app 的 scheme 名称:(如果不需要,直接回车)
在项目根目录下,初始化Fastlane:
fastlane init
提问了你的Apple ID,Team的问题之后,fastlane会自动检测当前目录下项目的App Name和App Identifier。如果检测的不对,选择n自行输入。
接下来会问你这个app是否需要在iTC和ADC中创建(上一步中如果选择y会自动检测是否需要创建),fastlane会调用produce进行初始化,如果现在还不想创建,也可以之后再运行produce init进行这个流程。如果不执行produce的流程,deliver的流程也会被掠过,当然之后也可以deliver init运行完全一样的流程。
在执行deliver init的过程中,会同步iTC中的所有语言的元数据和截图,并按照目录结构组织好。目录结构应该类似下面:
fastlane
├── Appfile
├── Deliverfile
├── Fastfile
├── metadata
│ ├── copyright.txt
│ ├── en-US
│ │ ├── description.txt
│ │ ├── keywords.txt
│ │ ├── marketing_url.txt
│ │ ├── name.txt
│ │ ├── privacy_url.txt
│ │ ├── release_notes.txt
│ │ └── support_url.txt
│ ├── primary_category.txt
│ ├── primary_first_sub_category.txt
│ ├── primary_second_sub_category.txt
│ ├── secondary_category.txt
│ ├── secondary_first_sub_category.txt
│ ├── secondary_second_sub_category.txt
│ └── zh-Hans
│ ├── description.txt
│ ├── keywords.txt
│ ├── marketing_url.txt
│ ├── name.txt
│ ├── privacy_url.txt
│ ├── release_notes.txt
│ └── support_url.txt
└── screenshots
├── README.txt
├── en-US
│ ├── 一堆png图片
这里肯定会被创建的是Appfile和Fastfile。如果Deliverfile,screenshots和metadata目录没被创建,可以运行deliver init来创建。
1. Fastfile => 用来定义所有的lane任务Fastfile帮助
2. Appfile => 是用来存储一些公共信息的,比如app_identifier,apple_id,team_id,itc_team_id等。Appfile帮助
3. Deliverfile => deliver的配置文件Deliverfile帮助
PS:
1. 这里有个小问题,iTC和ADC中的Team ID是不一样的,在fastlane init中只会自动在Appfile里写入ADC的team_id,所以在这个过程中会不停的问你iTC的Team ID,所以在创建完Appfile后,手动在里面添加itc_team_id。
2. 这个问答对不同的项目可能有各种各样的分支。我已经用不同的项目试过很多次了,但是可能还不是全部,所以你还需要见招拆招。
3. 在这里可以安心的输入密码,所有的密码都加密保存在系统的Keychain里。
接着在项目目录中会生成fastlane文件夹
其中Fastfile,Appfile,Deliverfile这三个文件,功能如上介绍,如果不出问题的话,大家的这三个文件内容应该是和我一样的如下(可以选择sublime打开,然后把当前显示样式设置为Ruby):
Fastfile:
fastlane_version "2.5.0"
default_platform :ios
platform :ios do
before_all do
# ENV["SLACK_URL"] = "https://hooks.slack.com/services/..."
end
desc "Runs all the tests"
lane :test do
scan
end
desc "Submit a new Beta Build to Apple TestFlight"
desc "This will also make sure the profile is up to date"
lane :beta do
# match(type: "appstore") # more information: https://codesigning.guide
gym(scheme: "BlusinessAreaPlat") # Build your app - more options available
pilot
# sh "your_script.sh"
# You can also use other beta testing services here (run `fastlane actions`)
end
desc "Deploy a new version to the App Store"
lane :release do
# match(type: "appstore")
# snapshot
gym(scheme: "BlusinessAreaPlat") # Build your app - more options available
deliver(force: true)
# frameit
end
# You can define as many lanes as you want
after_all do |lane|
# This block is called, only if the executed lane was successful
# slack(
# message: "Successfully deployed new App Update."
# )
end
error do |lane, exception|
# slack(
# message: exception.message,
# success: false
# )
end
end
在Fastfile这个文件中,就是我们打包,发布到fir,testFlight,appstore等等操作的具体配置文件。
Appfile:
app_identifier "com.xxxx.xxxx" # The bundle identifier of your app
apple_id "[email protected]" # Your Apple email address
team_id "XXXXXXXXX" # Developer Portal Team ID
Deliverfile:
app_identifier "com.xxxx.xxxx" # The bundle identifier of your app
username "[email protected]" # your Apple ID user
关于Fastfile文件
对照我们上边fastlane init命令创建出来的默认是的Fastfile默认文件,我们一次解析文件中的「元素」所代表的含义
fastlane_version => 指定fastlane最小版本
default_platform => 指定当前平台,可选ios,android,mac
desc => 一个lane(英文翻译是:小巷,小路,我们这里可以理解为任务)的描述,一般说明这个lane是做什么的
lane : 任务的名字 do => 指定任务的名字,我们在执行这个任务的时候,调用命令的格式为 fastlane 任务的名字,比如fastlane release。 在Fastfile文件中会有很多的lane,我们通俗的把理解为小任务,每个小任务都负责一个功能。 然后我们调用不同的小任务,来实现打包、上传到development、上传到testFlight、上传到app store等功能。 换句话来说,也就是,我们具体关于怎么打包、怎么上传的配置是放到对应的lane里边的
(lane......)end => lane到end标识之间的内容,声明了一个任务具体执行哪些操作,不指定哪些操作
这个模块是表示我们上传到app store的。
打包
这里再执行打包就很简单了,默认Fastfile中包含gym这一个功能模块的lane,都可以执行打包操作。 在gym中指定output_directory一项来指定输出的.ipa文件的输出目录,如果不指定的话,只在项目根目录下。
执行lane命令:
fastlane lane的名字
比如 fast lane release 执行打包上传到appstore