Rake task vs. Fastlane lane
在做 CI 的过程中,会遇到很多任务处理,有的有互相依赖、有的有前置条件等,对此,我主要阅读了 Rake 的 task 和 Fastlane 的 lane 两种方式。各有千秋,从书写调用、任务依赖、挂载支持、复用等方面入手,最后会通过讨论不同的实现细节,来编写更适合当前 CI 流程的 DSL。
环境信息
fastlane 2.85.0
rake 12.3.1
很多 DSL 都用 Ruby 来实现,这得益于它的语法糖和强大的元编程能力。Rake 是一个很出名的 DSL in Ruby,类似于 Make,它将一个个 task 串起来,形成了完整的 Workflow。而 Fastlane 是移动端强大的自动化工具,当我们使用时,需要编写 Fastfile,将自动化任务串起来。Fastfile 中的关键字 lane
和 Rake 中的关键字 task
都表示定义一个任务,但是他们的实现、组织方式、依赖管理、复用方式都有很大不同。
书写与调用方式
任务定义
Rake 和 Fastlane 的任务定义基本相同,熟悉其中一种,就能很快熟悉另一种。
# rake |
调用
rake |
在没有参数的时候,两种调用都差不多。但是在有参数的时候… Fastlane 的方案明显比 Rake 更加优雅。看到 Rake 能通过那么多种方式传参,好像很 6 的样子,但实际却恰恰相反,这正好说明了 Rake 传参的麻烦与不统一。为了能给 Rake 正确的传参,Stack Overflow 上还有很多相关的问答。其中一个高票回答大家感兴趣可以看看。
任务依赖
Rake
Rake 可为每个 task 添加依赖,比如:task_b 的先行条件 task_a:
desc "task_a desc" |
调用
rake task_b # => A B |
Fastlane
Fastlane 的依赖和 Rake 不同,不能添加 lane_a 依赖 lane_b 中每个 lane 之间的调用关系。只能通过在 lane 内部调用来实现(或者是支持但我不知道…求告知):
desc "lane_a desc" |
调用
fastlane lane_b # => A B |
挂载点支持
Rake 并没有原生提供挂载点,网上很多例子都是自己实现,而 Fastlane 提供了 before_all
,before_each
,after_all
,after_each
四种挂载点。可以在所有任务开始前后,每个任务开始前后处理一些事情,比如 pod install
等。
before_all do |options| |
调用
fastlane lane_a # => -1 A |
复用
书写方式两种方案类似,而调用另一个任务的方式不太一样。
Rake
Rake 的调用和传参一样恶心,硬编码,还需要 call 方法。
desc "task_b desc" |
Fastlane
Fastlane 直接是函数调用的方式,更优雅。
desc "lane_b desc" |
多参数
如果你觉得这还不足以展现出 Fastlane 的优雅,那么多参数的时候:
desc "lane_b desc" |
Rake 的传参…我想都不敢想。
加载其他文件
总不能把任务全都写在一个文件里吧,所以 Rake 和 Fastlane 都支持多文件加载。
# fastlane |
优劣势
虽然我明显倾向于 Fastlane,但其实他们还是各有优劣势的。
命名空间
Rake 支持,Fastlane 不支持。
namespace :a_name do |
默认任务
Rake 支持,Fastlane 不支持。
task :default => [:task_a] |
私有任务
Rake 不支持,Fastlane 支持。
desc "private lane" |
文件命名
Rake 灵活优雅,Fastlane 鸡肋。
Rake 会遍历当前文件夹中,名称为 Rakefile,rakefile,xxx.rake,xxx.rakefile 等文件。
Fastlane 的文件路径则必须是 fastlane/Fastfile。
任务列表
都支持。
rake -T |
其他
除以上的对比外,Fastlane 有几个明显的劣势:
- 太重。因为 Fastlane 作为移动端的集成工具,DSL 这部分并没有单独封装,要用的话,还必须安装全部依赖。
- 输出信息太多。虽然有环境变量可以控制,但是 Fastlane 在自动查找 issue、提示版本升级等信息实在是太多了。
最后
看了这两种任务管理在使用上区别以后,接下来会从源码方面分析他们的具体实现,这其中还可以学习到很多 Ruby 元编程的实践。而最终目的是想要打造一个适合自己业务的工具。