<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: icyleaf</title>
    <description>The latest articles on DEV Community by icyleaf (@icyleaf).</description>
    <link>https://dev.to/icyleaf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F222340%2F5eeb2c92-c440-4900-8043-bdeb662e902f.png</url>
      <title>DEV Community: icyleaf</title>
      <link>https://dev.to/icyleaf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/icyleaf"/>
    <language>en</language>
    <item>
      <title>Fastlane: 深入浅出一看你就懂</title>
      <dc:creator>icyleaf</dc:creator>
      <pubDate>Fri, 19 Aug 2022 09:09:00 +0000</pubDate>
      <link>https://dev.to/icyleaf/fastlane-shen-ru-qian-chu-kan-ni-jiu-dong-d04</link>
      <guid>https://dev.to/icyleaf/fastlane-shen-ru-qian-chu-kan-ni-jiu-dong-d04</guid>
      <description>&lt;p&gt;这是《 &lt;a href="https://icyleaf.com/2016/07/intro-fastlane-automation-for-ios-and-android/"&gt;Fastlane - iOS 和 Android 的自动化构建工具&lt;/a&gt;》系列的第二篇。&lt;/p&gt;

&lt;p&gt;本篇我想着重介绍 &lt;code&gt;fastlane&lt;/code&gt; 本身的基本使用，这里使用 fastlane v1.98.0 作为演示版本。&lt;/p&gt;

&lt;h3&gt;
  
  
  系列索引
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://icyleaf.com/2016/07/intro-fastlane-automation-for-ios-and-android/"&gt;Fastlane - iOS 和 Android 的自动化构建工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://icyleaf.com/2016/07/fastlane-in-action/"&gt;深入浅出 Fastlane 一看你就懂&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://icyleaf.com/2017/03/fastlane-match-in-action/"&gt;你虐我千百遍，我待你如初恋，直到我遇到 match&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  命令行工具
&lt;/h2&gt;

&lt;p&gt;安装之后默认会安装一个命令行工具 &lt;code&gt;fastlane&lt;/code&gt;，利用它可以初始化、执行任务、查看任务定义、查看可用的动作和动作的详细定义，甚至可以用它来创建自定义的动作、插件以及一些辅助功能。想了解的话可以先看看它的帮助：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane &lt;span class="nt"&gt;--help&lt;/span&gt;

  fastlane

  CLI &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;'fastlane'&lt;/span&gt; - The easiest way to automate building and releasing your iOS and Android apps

        Run using &lt;span class="sb"&gt;`&lt;/span&gt;fastlane &lt;span class="o"&gt;[&lt;/span&gt;platform] &lt;span class="o"&gt;[&lt;/span&gt;lane_name]&lt;span class="sb"&gt;`&lt;/span&gt;
        To pass values to the lanes use &lt;span class="sb"&gt;`&lt;/span&gt;fastlane &lt;span class="o"&gt;[&lt;/span&gt;platform] &lt;span class="o"&gt;[&lt;/span&gt;lane_name] key:value key2:value2&lt;span class="sb"&gt;`&lt;/span&gt;

  Commands:
    action                  Shows more information &lt;span class="k"&gt;for &lt;/span&gt;a specific &lt;span class="nb"&gt;command
    &lt;/span&gt;actions                 Lists all available fastlane actions
    add_plugin              Add a new plugin to your fastlane setup
    disable_crash_reporting Deprecated: fastlane doesn&lt;span class="s1"&gt;'t use a crash reporter any more
    docs                    Generate a markdown based documentation based on the Fastfile
    enable_auto_complete    Enable tab auto completion
    enable_crash_reporting  Deprecated: fastlane doesn'&lt;/span&gt;t use a crash reporter any more
    &lt;span class="nb"&gt;help                    &lt;/span&gt;Display global or &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nb"&gt;help &lt;/span&gt;documentation
    init                    Helps you with your initial fastlane setup
    install_plugins         Install all plugins &lt;span class="k"&gt;for &lt;/span&gt;this project
    lanes                   Lists all available lanes and shows their description
    list                    Lists all available lanes without description
    new_action              Create a new custom action &lt;span class="k"&gt;for &lt;/span&gt;fastlane.
    new_plugin              Create a new plugin that can be used with fastlane
    run                     Run a fastlane one-off action without a full lane
    search_plugins          Search &lt;span class="k"&gt;for &lt;/span&gt;plugins, search query is optional
    trigger                 Run a sepcific lane. Pass the lane name and optionally the platform first.
    update_plugins          Update all plugin dependencies

  Global Options:
    &lt;span class="nt"&gt;--verbose&lt;/span&gt;
    &lt;span class="nt"&gt;-h&lt;/span&gt;, &lt;span class="nt"&gt;--help&lt;/span&gt;           Display &lt;span class="nb"&gt;help &lt;/span&gt;documentation
    &lt;span class="nt"&gt;-v&lt;/span&gt;, &lt;span class="nt"&gt;--version&lt;/span&gt;        Display version information

  Author:
    Felix Krause &amp;lt;fastlane@krausefx.com&amp;gt;

  Website:
    https://fastlane.tools

  GitHub:
    https://github.com/fastlane/fastlane
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;我会随着下面每个概念的解释和展开来配合上面的命令一起讲解。&lt;/p&gt;

&lt;h2&gt;
  
  
  生命周期
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;执行顺序&lt;/th&gt;
&lt;th&gt;方法名&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;before_all&lt;/td&gt;
&lt;td&gt;在执行 lane 之前只执行一次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;before_each&lt;/td&gt;
&lt;td&gt;每次执行 lane 之前都会执行一次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;lane&lt;/td&gt;
&lt;td&gt;自定义的任务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;after_each&lt;/td&gt;
&lt;td&gt;每次执行 lane 之后都会执行一次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;after_all&lt;/td&gt;
&lt;td&gt;在执行 lane 成功结束之后执行一次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;error&lt;/td&gt;
&lt;td&gt;在执行上述情况任意环境报错都会中止并执行一次&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;以上的部分大家在上一篇已经见识过了，有些还没接触到，不用着急都会一一说明。&lt;/p&gt;

&lt;h2&gt;
  
  
  任务（lane）
&lt;/h2&gt;

&lt;p&gt;正常情况下你可能只会是用到一种任务方法 &lt;code&gt;lane&lt;/code&gt; 但其实它会包含很多中高级用法。在文章的末尾会详细描述。&lt;/p&gt;

&lt;h3&gt;
  
  
  任务定义
&lt;/h3&gt;

&lt;p&gt;定义任务的方法类似于 rake 的 task，但使用上缺比前者要好用很多，见下表：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;定义&lt;/th&gt;
&lt;th&gt;是否必须&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;desc&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;方法描述&lt;/td&gt;
&lt;td&gt;可多次使用打到换行的目的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;方法名&lt;/td&gt;
&lt;td&gt;符号化的方法名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;options&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;方法参数&lt;/td&gt;
&lt;td&gt;返回 Hash 类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;task&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;方法主体&lt;/td&gt;
&lt;td&gt;参考 ruby 的方法代码且支持 ruby 代码&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'定义一个 build 方法'&lt;/span&gt;
&lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'参数 adhoc 判断是否为内测版本, 默认为 false'&lt;/span&gt;
&lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'fastlane build'&lt;/span&gt;
&lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'fastlane build adhoc:true'&lt;/span&gt;
&lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:build&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="c1"&gt;# task to do something&lt;/span&gt;
  &lt;span class="n"&gt;adhoc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:adhoc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"adhoc: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;adhoc&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

  &lt;span class="n"&gt;gym&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="n"&gt;adhoc&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;'adhoc'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'appstore'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  任务执行
&lt;/h3&gt;

&lt;p&gt;一般情况下它需要配合定义好的 lane 才能使用，刚刚我们定义的一个 build 方法，我们这里就试着执行一下吧。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 默认执行&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane build
&lt;span class="c"&gt;# 传递参数&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane build adhoc:true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  任务互调
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;lane&lt;/code&gt; 其实可以理解为 &lt;code&gt;def&lt;/code&gt; 的别名，因此多个 lane 的话实际上是可以相互调用的，这个其实特别实用，这样其实我就可以把 cocoapods 的执行放到单独的 lane 里面而不是 &lt;code&gt;before_all&lt;/code&gt;，这样执行非构建的任务就不会执行不相关的任务或动作，因此 fastlane 而产生了一个私有任务用内部使用 &lt;code&gt;private_lane&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;
&lt;span class="n"&gt;default_platform&lt;/span&gt; &lt;span class="ss"&gt;:ios&lt;/span&gt;

&lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="ss"&gt;:ios&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'构建前的准备工作'&lt;/span&gt;
  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'这是一个私有任务，仅供 Fastfile 内部 lane 调用使用'&lt;/span&gt;
  &lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:prepare&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;cocoapods&lt;/span&gt;
    &lt;span class="n"&gt;match&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'通用的构建任务'&lt;/span&gt;
  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'fastlane build'&lt;/span&gt;
  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'fastlane build type:adhoc'&lt;/span&gt;
  &lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:build&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="c1"&gt;# 调用上面 prepare 私有任务&lt;/span&gt;
    &lt;span class="n"&gt;prepare&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:type&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="s1"&gt;'adhoc'&lt;/span&gt;
      &lt;span class="c1"&gt;# 调用 下面 adhoc 任务&lt;/span&gt;
      &lt;span class="n"&gt;adhoc&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="c1"&gt;# 调用下面 appstore 任务&lt;/span&gt;
      &lt;span class="n"&gt;appstore&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'构建 adhoc 任务'&lt;/span&gt;
  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'fastlane adhoc'&lt;/span&gt;
  &lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:adhoc&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;gym&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="s1"&gt;'adhoc'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'构建 appstore 任务'&lt;/span&gt;
  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'fastlane appstore'&lt;/span&gt;
  &lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:appstore&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;gym&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="s1"&gt;'appstore'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;上面的任务中，&lt;code&gt;build&lt;/code&gt;/&lt;code&gt;adhoc&lt;/code&gt;/&lt;code&gt;appstore&lt;/code&gt; 都可以执行，只有 &lt;code&gt;prepare&lt;/code&gt; 是无法通过命令行外部执行，如果执行会直接报错：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane prepare
&lt;span class="o"&gt;[&lt;/span&gt;19:17:42]: You can&lt;span class="s1"&gt;'t call the private lane '&lt;/span&gt;prepare&lt;span class="s1"&gt;' directly
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  任务返回值
&lt;/h3&gt;

&lt;p&gt;和 ruby 的方法一致，每个 lane 最后一行会默认作为返回值（无需 &lt;a href="http://learnrubythehardway.org/book/ex21.html"&gt;return&lt;/a&gt;）。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;
&lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:sum&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;optiona&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:calculate&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;a: &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;b: &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; 8&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  引入外部任务文件
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Fastfile&lt;/code&gt; 除了自身以外还能够引入外部其他的 &lt;code&gt;Fastfile&lt;/code&gt; 并调用任务，只需要导入外部文件并使用特殊的方法标识即可：&lt;/p&gt;

&lt;h4&gt;
  
  
  1. import - 导入本地文件
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 导入 lanes 目录的 AndroidFastfile&lt;/span&gt;
&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="s2"&gt;"lanes/AndroidFastfile"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. import_from_git - 导入 git 仓库文件
&lt;/h4&gt;

&lt;p&gt;可以直接引入 git 仓库的 Fastfile 文件是一个非常赞的功能，通过使用发现其实现原理是先把 git 仓库克隆下来后在引入相对于的文件，因此建议国内在没有网络加速（翻墙）的情况下尽量不用引入比较大的 git 仓库，否则使用会需要漫长的等待...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 导入 mozilla/firefox-ios 项目下 fastlane 下面 Fastfile 文件&lt;/span&gt;
&lt;span class="n"&gt;import_from_git&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;url: &lt;/span&gt;&lt;span class="s1"&gt;'https://github.com/mozilla/firefox-ios'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 或者&lt;/span&gt;
&lt;span class="n"&gt;import_from_git&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;url: &lt;/span&gt;&lt;span class="s1"&gt;'git@github.com:mozilla/firefox-ios.git'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="ss"&gt;path: &lt;/span&gt;&lt;span class="s1"&gt;'fastlane/Fastfile'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;假若外部引入的 &lt;code&gt;Fastfile&lt;/code&gt; 有个方法是 &lt;strong&gt;build&lt;/strong&gt;，在命令行工具直接执行即可，如果外部和内部都有相同的任务名，执行会直接报错：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane ios build

&lt;span class="o"&gt;[!]&lt;/span&gt; Lane &lt;span class="s1"&gt;'gradle'&lt;/span&gt; was defined multiple &lt;span class="nb"&gt;times&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果发生这样的事情且你希望在主体 &lt;code&gt;Fastfile&lt;/code&gt; 也调用的话需要使用特殊的方法定义：&lt;code&gt;override_lane&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;注意：此方法只会覆盖外部的相同方法名的代码执行，目前暂时无法使用类似 ruby 的 &lt;code&gt;super&lt;/code&gt; 继承原由方法！&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;override_lane&lt;/span&gt; &lt;span class="ss"&gt;:build&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  任务查看
&lt;/h3&gt;

&lt;p&gt;只需执行下面这行命令就可以看到非私有任务的可用列表信息&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane lanes

&lt;span class="nt"&gt;---------&lt;/span&gt; ios---------
&lt;span class="nt"&gt;-----&lt;/span&gt; fastlane ios build
通用的构建任务
fastlane build
fastlane build &lt;span class="nb"&gt;type&lt;/span&gt;:adhoc

&lt;span class="nt"&gt;-----&lt;/span&gt; fastlane ios adhoc
构建 adhoc 任务

&lt;span class="nt"&gt;-----&lt;/span&gt; fastlane ios appstore
构建 appstore 任务

Execute using &lt;span class="sb"&gt;`&lt;/span&gt;fastlane &lt;span class="o"&gt;[&lt;/span&gt;lane_name]&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  扩展（Action）
&lt;/h2&gt;

&lt;p&gt;扩展是 fastlane 的杀手锏，重在集成了众多非常优秀好用的方法供 lane 内部使用，截至 fastlane v&lt;code&gt;1.98.0&lt;/code&gt; 版本以包含 175 个扩展，这个数量还在陆续增加中。扩展初期是由发起人一个人完成，后续的大部分都是社区共享，如果你发现没有你想要的扩展，可以先去 &lt;a href="https://github.com/fastlane/fastlane/issues?q=is%3Aopen+is%3Aissue+label%3Aaction"&gt;issues&lt;/a&gt; 搜索下没有要么自己动手提交要么只有等待了.&lt;/p&gt;

&lt;h3&gt;
  
  
  扩展列表
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane actions
+--------------------+-------------------------------------------------------------+------------------+
|                                   Available fastlane actions                                        |
+--------------------+-------------------------------------------------------------+------------------+
| Action             | Description                                                 | Author           |
+--------------------+-------------------------------------------------------------+------------------+
| adb                | Run ADB Actions                                             | hjanuschka       |
| adb_devices        | Get an Array of Connected android device serials            | hjanuschka       |
| add_git_tag        | This will add an annotated git tag to the current branch    | Multiple         |
...
+--------------------+-------------------------------------------------------------+------------------+
  Total of 175 actions

Get more information &lt;span class="k"&gt;for &lt;/span&gt;one specific action using &lt;span class="sb"&gt;`&lt;/span&gt;fastlane action &lt;span class="o"&gt;[&lt;/span&gt;name]&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  扩展使用帮助
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 查看 adb 扩展的使用帮助&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane action adb
Loading documentation &lt;span class="k"&gt;for &lt;/span&gt;adb:

+---------------------------------+
|               adb               |
+---------------------------------+
| Run ADB Actions                 |
|                                 |
| see adb &lt;span class="nt"&gt;--help&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;more details |
|                                 |
| Created by hjanuschka           |
+---------------------------------+

+----------+----------------------------------------------------------------------+-------------------+---------+
|                                                  adb Options                                                  |
+----------+----------------------------------------------------------------------+-------------------+---------+
| Key      | Description                                                          | Env Var           | Default |
+----------+----------------------------------------------------------------------+-------------------+---------+
| serial   | Android serial, which device should be used &lt;span class="k"&gt;for &lt;/span&gt;this &lt;span class="nb"&gt;command&lt;/span&gt;         | FL_ANDROID_SERIAL |         |
| &lt;span class="nb"&gt;command&lt;/span&gt;  | All commands you want to pass to the adb &lt;span class="nb"&gt;command&lt;/span&gt;, e.g. &lt;span class="sb"&gt;`&lt;/span&gt;kill-server&lt;span class="sb"&gt;`&lt;/span&gt; | FL_ADB_COMMAND    |         |
| adb_path | The path to your &lt;span class="sb"&gt;`&lt;/span&gt;adb&lt;span class="sb"&gt;`&lt;/span&gt; binary                                        | FL_ADB_PATH       | adb     |
+----------+----------------------------------------------------------------------+-------------------+---------+

+-------------------------------+
|       adb Return Value        |
+-------------------------------+
| The output of the adb &lt;span class="nb"&gt;command&lt;/span&gt; |
+-------------------------------+

More information can be found on https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Actions.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  创建自定义扩展
&lt;/h3&gt;

&lt;p&gt;通过内置的命令创建你需要的扩展，扩展名必须是全部小写且只能使用下划线分割词组，生成好的扩展文件会在 &lt;code&gt;fastlane/actions&lt;/code&gt; 目录找到:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane new_action
Must be lower &lt;span class="k"&gt;case&lt;/span&gt;, and use a &lt;span class="s1"&gt;'_'&lt;/span&gt; between words. Do not use &lt;span class="s1"&gt;'.'&lt;/span&gt;
examples: &lt;span class="s1"&gt;'testflight'&lt;/span&gt;, &lt;span class="s1"&gt;'upload_to_s3'&lt;/span&gt;
Name of your action: hello
&lt;span class="o"&gt;[&lt;/span&gt;15:33:15]: Created new action file &lt;span class="s1"&gt;'./fastlane/actions/hello.rb'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Edit it to implement your custom action.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这块会占比较大的篇幅，尽情期待后续的展开。&lt;/p&gt;

&lt;h3&gt;
  
  
  引入外部扩展
&lt;/h3&gt;

&lt;p&gt;这块其实也有两种方法可以引入，文件引入是官方教程提供的方法，第二种是我个人尝试出来的，第三种是最近版本才官方支持的。&lt;/p&gt;

&lt;h4&gt;
  
  
  1. 本地文件引入
&lt;/h4&gt;

&lt;p&gt;自定义的扩展其实也算是本地文件引入的一种形式，当然位于其他路径的通过指定方法也能做到&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 引入项目根目录 script/share_actions 路径&lt;/span&gt;
&lt;span class="n"&gt;actions_path&lt;/span&gt; &lt;span class="s1"&gt;'../script/share_actions'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. rubygem 引入
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;不再建议使用本方法，请看第三种插件引入。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;我在团队内部创建了一个自定义的扩展，仅限于团队内部使用而无法贡献社区，我只能采取封装成 ruby gem 包，通过 ruby 的 &lt;code&gt;require&lt;/code&gt; 方式引入，最终可以完美支持，目前已在项目中使用大半年之久。最重要的是我是开源的：&lt;a href="https://github.com/icyleaf/fastlane-qyer"&gt;fastlane-qyer&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 首先安装需要的 rubygem: gem install fastlane-qyer&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'fastlane-qyer'&lt;/span&gt;

&lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:upload&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;qyer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;api_key: &lt;/span&gt;&lt;span class="s1"&gt;'[token]'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;注意，使用 rubygem 引入的无法在 fastlane actions 中显示出来，也无法使用 fastlane action [name] 查看使用帮助。我猜想一是官方没有这样提供思路，二是就算你引入了 gem 也不是特别好判断里面的文件结构。&lt;/p&gt;

&lt;h4&gt;
  
  
  3. 插件引入
&lt;/h4&gt;

&lt;p&gt;我注意到 &lt;a href="https://github.com/fastlane/fastlane/releases/tag/1.93.0"&gt;1.93.0&lt;/a&gt; 增加了插件机制，很好的解决第二种出现的一些问题。大概看了一下主要是采用 &lt;code&gt;Gemfile&lt;/code&gt; 的方式使用 &lt;code&gt;Pluginfile&lt;/code&gt; 维护了引入第三方插件列表。实现原理还是属于第二种方法。&lt;/p&gt;

&lt;p&gt;通过 &lt;code&gt;fastlane search_plugins&lt;/code&gt; 查看当前支持的插件，并使用 &lt;code&gt;fastlane add_plugins [name]&lt;/code&gt; 引入。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane search_plugins
&lt;span class="o"&gt;[&lt;/span&gt;16:04:33]: Listing all available fastlane plugins

+--------------------------+---------------------------------------------------+-----------+
|                                Available fastlane plugins                                |
+--------------------------+---------------------------------------------------+-----------+
| Name                     | Description                                       | Downloads |
+--------------------------+---------------------------------------------------+-----------+
| ruby                     | Useful fastlane actions &lt;span class="k"&gt;for &lt;/span&gt;Ruby projects         | 782       |
| versioning               | Allows to work &lt;span class="nb"&gt;set&lt;/span&gt;/get app version directly       | 758       |
|                          | to/from Info.plist                                |           |
| branding                 | Add some branding to your fastlane output         | 716       |
| instrumented_tests       | New action to run instrumented tests &lt;span class="k"&gt;for &lt;/span&gt;android. | 590       |
|                          | This basically creates and boots an emulator      |           |
|                          | before running an gradle commands so that you can |           |
|                          | run instrumented tests against that emulator.     |           |
|                          | After the gradle &lt;span class="nb"&gt;command &lt;/span&gt;is executed, the avd     |           |
|                          | gets shut down and deleted. This is really        |           |
|                          | helpful on CI services, keeping them clean and    |           |
|                          | always having a fresh avd &lt;span class="k"&gt;for &lt;/span&gt;testing.            |           |
| xamarin_build            | Build xamarin android&lt;span class="se"&gt;\i&lt;/span&gt;os projects                | 582       |
| appicon                  | Generate required icon sizes and iconset from a   | 509       |
|                          | master application icon.                          |           |
...
| download_file            | This action downloads a file from an HTTP/HTTPS   | 171       |
|                          | url &lt;span class="o"&gt;(&lt;/span&gt;e.g. ZIP file&lt;span class="o"&gt;)&lt;/span&gt; and puts it &lt;span class="k"&gt;in &lt;/span&gt;a destination  |           |
|                          | path                                              |           |
+--------------------------+---------------------------------------------------+-----------+

&lt;span class="c"&gt;# 添加 sentry 插件&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane add_plugin sentry
&lt;span class="o"&gt;[&lt;/span&gt;16:16:23]: Plugin &lt;span class="s1"&gt;'fastlane-plugin-sentry'&lt;/span&gt; was added to &lt;span class="s1"&gt;'./fastlane/Pluginfile'&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;16:16:23]: It looks like fastlane plugins are not yet &lt;span class="nb"&gt;set &lt;/span&gt;up &lt;span class="k"&gt;for &lt;/span&gt;this project.
&lt;span class="o"&gt;[&lt;/span&gt;16:16:23]: fastlane will create a new Gemfile at path &lt;span class="s1"&gt;'Gemfile'&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;16:16:23]: This change is neccessary &lt;span class="k"&gt;for &lt;/span&gt;fastlane plugins to work
Should fastlane modify the Gemfile at path &lt;span class="s1"&gt;'Gemfile'&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;you? &lt;span class="o"&gt;(&lt;/span&gt;y/n&lt;span class="o"&gt;)&lt;/span&gt;
y
&lt;span class="o"&gt;[&lt;/span&gt;16:16:29]: Successfully modified &lt;span class="s1"&gt;'Gemfile'&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;16:16:29]: Make sure to commit your Gemfile, Gemfile.lock and Pluginfile to version control
Installing plugin dependencies...
Successfully installed plugins

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;fastlane/Pluginfile
&lt;span class="c"&gt;# Autogenerated by fastlane&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# Ensure this file is checked in to source control!&lt;/span&gt;

gem &lt;span class="s1"&gt;'fastlane-plugin-sentry'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;更详细的继续期待后续报道，我要挖坑无数。&lt;/p&gt;

&lt;h3&gt;
  
  
  扩展的命令行调用
&lt;/h3&gt;

&lt;p&gt;社区的力量果然是很强大的，陆续添加了那么多功能，早期用户表示不开心！嗯，由于社区的呼声和贡献目前可以通过命令调用扩展：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 使用 notification 扩展发送一个通知消息&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane run notification message:&lt;span class="s2"&gt;"Hi macOS"&lt;/span&gt; title:&lt;span class="s2"&gt;"Fastlane Notification"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;15:58:05]: &lt;span class="nt"&gt;--------------------------&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;15:58:05]: &lt;span class="nt"&gt;---&lt;/span&gt; Step: notification &lt;span class="nt"&gt;---&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;15:58:05]: &lt;span class="nt"&gt;--------------------------&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;15:58:05]: Result: &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  辅助功能
&lt;/h2&gt;

&lt;h3&gt;
  
  
  自动更新
&lt;/h3&gt;

&lt;p&gt;fastlane 提供一个方法 &lt;code&gt;update_fastlane&lt;/code&gt; 用于对于自身的版本检查和更新，这个第一篇文章我也有提到过。它其实一个是一个扩展，使用 &lt;code&gt;fastlane action update_fastlane&lt;/code&gt; 能够看到使用帮助。它有一个参数是可以指定检查特定的 fastlane 工具并进行更新，但其实它是使用 rubygems 进行对 gem 的更新，因此这块其实可以传入任何需要检查并更新的 gem：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;update_fastlane&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="ss"&gt;:'fastlane,gym,match,cocoapods,rest-client'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  环境变量
&lt;/h3&gt;

&lt;p&gt;从 fastlane 的设计体系上在各个地方都加入了环境变量的支持，每个扩展的参数、以及扩展需要共享给其他扩展和任务读取的数据都是通过环境变量获取，如下是我收集的比较常用的列表：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;环境变量&lt;/th&gt;
&lt;th&gt;来源&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FASTLANE_USER&lt;/td&gt;
&lt;td&gt;credentials_manager&lt;/td&gt;
&lt;td&gt;Apple 开发者账户名&lt;/td&gt;
&lt;td&gt;验证通过后会保存 Keychain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FASTLANE_PASSWORD&lt;/td&gt;
&lt;td&gt;credentials_manager&lt;/td&gt;
&lt;td&gt;Apple 开发者账户密码&lt;/td&gt;
&lt;td&gt;验证通过后会保存 Keychain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FASTLANE_TEAM_ID&lt;br&gt;CERT_TEAM_ID&lt;/td&gt;
&lt;td&gt;produce&lt;br&gt;sigh&lt;/td&gt;
&lt;td&gt;Apple 团队 ID&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELIVER_USER&lt;br&gt;PRODUCE_USERNAME&lt;/td&gt;
&lt;td&gt;deliver&lt;br&gt;produce&lt;/td&gt;
&lt;td&gt;iTunesConnect 账户名&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELIVER_PASSWORD&lt;/td&gt;
&lt;td&gt;deliver&lt;/td&gt;
&lt;td&gt;iTunesConnect 账户密码&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MATCH_PASSWORD&lt;/td&gt;
&lt;td&gt;match&lt;/td&gt;
&lt;td&gt;证书加/解密密码&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FASTLANE_XCODE_LIST_TIMEOUT&lt;/td&gt;
&lt;td&gt;fastlane_core&lt;/td&gt;
&lt;td&gt;获取 iOS Scheme 的超时时间&lt;/td&gt;
&lt;td&gt;默认 10s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>fastlane</category>
      <category>ios</category>
      <category>android</category>
    </item>
    <item>
      <title>Fastlane: iOS 和 Android 的自动化构建工具</title>
      <dc:creator>icyleaf</dc:creator>
      <pubDate>Fri, 19 Aug 2022 09:08:00 +0000</pubDate>
      <link>https://dev.to/icyleaf/fastlane-ios-he-android-de-zi-dong-hua-gou-jian-gong-ju-3eji</link>
      <guid>https://dev.to/icyleaf/fastlane-ios-he-android-de-zi-dong-hua-gou-jian-gong-ju-3eji</guid>
      <description>&lt;h3&gt;
  
  
  系列索引
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://icyleaf.com/2016/07/intro-fastlane-automation-for-ios-and-android/"&gt;Fastlane - iOS 和 Android 的自动化构建工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://icyleaf.com/2016/07/fastlane-in-action/"&gt;深入浅出 Fastlane 一看你就懂&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://icyleaf.com/2017/03/fastlane-match-in-action/"&gt;你虐我千百遍，我待你如初恋，直到我遇到 match&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  前言
&lt;/h2&gt;

&lt;p&gt;这篇文章整理了很久，发现在一篇文章里无法一一讲述和全面的覆盖，初步打算是把这个做成一个系列，想到哪里就写到哪里，如果恰好有读者爱戴并有一些建议反馈，我也会根据大家的需要调整内容的方向和深度。论美剧的编剧的重要性(笑)。&lt;/p&gt;

&lt;h2&gt;
  
  
  初次邂逅
&lt;/h2&gt;

&lt;p&gt;初时 fastlane 的时候是去年的 11 月份，看到大就感觉遇到了神器一般的惊喜。它一个针对于 iOS 和 Android（后来才支持的）全方位自动化流程的工具，请看下图&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IKtsxwFn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fastlane.tools/assets/img/intro-fastlane-tree.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IKtsxwFn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fastlane.tools/assets/img/intro-fastlane-tree.png" alt="fastlane-flow" width="880" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;流程图中每个环节都是独立的工具，每个工具只干一件事情，分工非常的明确。以下是我在团队项目中用到的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/fastlane/fastlane/tree/master/scan"&gt;scan&lt;/a&gt; 自动化测试工具，很好的封装了 Unit Test&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/fastlane/fastlane/tree/master/sigh"&gt;sigh&lt;/a&gt; 针对于 iOS 项目开发证书和 Provision file 的下载工具&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/fastlane/fastlane/tree/master/match"&gt;match&lt;/a&gt; 同步团队每个人的证书和 Provision file 的超赞工具，规范&lt;a href="https://codesigning.guide/"&gt;代码签名&lt;/a&gt;（虽然里面有些设定比较损）&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/fastlane/fastlane/tree/master/gym"&gt;gym&lt;/a&gt; 针对于 iOS 打包和签名的自动化工具，完爆 &lt;code&gt;xctool&lt;/code&gt;，而 &lt;code&gt;shenzhen&lt;/code&gt; 也放弃维护&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/icyleaf/fastlane-qyer"&gt;qyer&lt;/a&gt; 团队定制的工具，用于检测包和上传到自己的内部分发平台&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/fastlane/fastlane"&gt;fastlane&lt;/a&gt; 简单理解就是控制整体流程和实现的框架容器&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;利用目前支持的工具可以做所有包含自动化和可持续化构建的每个环节，比如单元测试、截图、分发渠道、上传元数据和 ipa 包提交审核等等。看到这这些是不是很兴奋？&lt;br&gt;
反正我看到之后就像黑夜看到了光明，果断抛弃自己维护的脚本。&lt;/p&gt;
&lt;h2&gt;
  
  
  基本构成
&lt;/h2&gt;

&lt;p&gt;Fastlane 提供的流程的众多工具都是可以独立存在和使用（提供 cli 命令），也可以统一由 fastlane 来控制。它在使用中提出了两个概念：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;action&lt;/code&gt;: Fastlane 的插件，截至当前内置 165 个至多，不过每个动作的颗粒度大小不一。&lt;a href="https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Actions.md"&gt;查看详情&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lane&lt;/code&gt;: Fastlane 的任务（或者可以理解为命令），一个可以包含多个 lanes，通过 &lt;code&gt;fastlane&lt;/code&gt; cli 传入制定的 lane 来执行。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;光说不干假把式，看法宝：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:adhoc&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="c1"&gt;# build version 自动加一&lt;/span&gt;
  &lt;span class="n"&gt;increment_build_number&lt;/span&gt;
  &lt;span class="c1"&gt;# 执行 pod install&lt;/span&gt;
  &lt;span class="n"&gt;cocoapods&lt;/span&gt;
  &lt;span class="c1"&gt;# 调用 facebook 的 xctool 进行单元测试&lt;/span&gt;
  &lt;span class="n"&gt;xctool&lt;/span&gt;
  &lt;span class="c1"&gt;# 对模拟器运行的 App 进行截图&lt;/span&gt;
  &lt;span class="n"&gt;snapshot&lt;/span&gt;
  &lt;span class="c1"&gt;# 安装团队证书和 profiles&lt;/span&gt;
  &lt;span class="n"&gt;match&lt;/span&gt;
  &lt;span class="c1"&gt;# 上传 App 元数据和签名的 ipa 到 iTunes Conneects&lt;/span&gt;
  &lt;span class="n"&gt;deliver&lt;/span&gt;
  &lt;span class="c1"&gt;# 把截图套进一个设备外壳&lt;/span&gt;
  &lt;span class="n"&gt;frameit&lt;/span&gt;
  &lt;span class="c1"&gt;# 允许自定义的脚本文件&lt;/span&gt;
  &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"./customScript.sh"&lt;/span&gt;
  &lt;span class="c1"&gt;# 发消息到 slack&lt;/span&gt;
  &lt;span class="n"&gt;slack&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  安装
&lt;/h2&gt;

&lt;p&gt;工具的起源本身是专门针对 iOS 项目，因此目前依赖于 macOS 10.9 以上系统，Ruby 是一个众所周知的轮子发明者，很多知名的工具都是它开发的，fastlane 也不例外。以下是依赖环境：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;macOS 10.9+&lt;/li&gt;
&lt;li&gt;Ruby 2.0+ (推荐 rvm 或 rbenv 安装)&lt;/li&gt;
&lt;li&gt;Xcode + command line tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;以上依赖配置好之后就可以通过 rubygem 进行安装：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; gem &lt;span class="nb"&gt;install &lt;/span&gt;fastlane
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;fastlane 默认会把核心工具都会进行安装，需要大家耐心等待一会...&lt;/p&gt;

&lt;h2&gt;
  
  
  初始化
&lt;/h2&gt;

&lt;p&gt;有两种方法可以初始化，一种是通过命令，一种是自己创建指定的（至少包含一个）约束文件 &lt;code&gt;Fastfile&lt;/code&gt;。首先我先介绍大家使用命令初始化:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 切换只你开发的 iOS 项目根目录&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;to/your/ios/project
&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane init
&lt;span class="o"&gt;[&lt;/span&gt;11:46:34]: Detected iOS/Mac project &lt;span class="k"&gt;in &lt;/span&gt;current directory...
&lt;span class="o"&gt;[&lt;/span&gt;11:46:34]: This setup will &lt;span class="nb"&gt;help &lt;/span&gt;you get up and running &lt;span class="k"&gt;in &lt;/span&gt;no time.
&lt;span class="o"&gt;[&lt;/span&gt;11:46:34]: fastlane will check what tools you&lt;span class="s1"&gt;'re already using and set up
[11:46:34]: the tool automatically for you. Have fun!
[11:46:34]: Created new folder '&lt;/span&gt;./fastlane&lt;span class="s1"&gt;'.
...
Your Apple ID (e.g. fastlane@krausefx.com): xxx@gmail.com
[11:46:59]: Verifying if app is available on the Apple Developer Portal and iTunes Connect...
[11:46:59]: Starting login with user '&lt;/span&gt;xxx@gmail.com&lt;span class="s1"&gt;'
Multiple teams found on the Developer Portal, please enter the number of the team you want to use:
1) XXXXXXXXXX "XXXXXXXXXX" (In-House)
2) YYYYYYYYYY "YYYYYYYYYY" (Company/Organization)
+----------------+----------------------------------------------------------------------------+
|                                       Detected Values                                       |
+----------------+----------------------------------------------------------------------------+
| Apple ID       | xxx@gmail.com                                                              |
| App Name       | Hello Fastlane                                                             |
| App Identifier | com.icyleaf.demo.HelloFastlane                                             |
| Workspace      | /Users/icyleaf/Development/iOS/HelloFastlane.xcworkspace                   |
+----------------+----------------------------------------------------------------------------+

[11:48:36]: This app identifier doesn'&lt;/span&gt;t exist on iTunes Connect yet, it will be created &lt;span class="k"&gt;for &lt;/span&gt;you
Please confirm the above values &lt;span class="o"&gt;(&lt;/span&gt;y/n&lt;span class="o"&gt;)&lt;/span&gt; n
App Identifier &lt;span class="o"&gt;(&lt;/span&gt;com.krausefx.app&lt;span class="o"&gt;)&lt;/span&gt;: com.icyleaf.demo.HelloFastlane
&lt;span class="o"&gt;[&lt;/span&gt;11:50:04]: Created new file &lt;span class="s1"&gt;'./fastlane/Appfile'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Edit it to manage your preferred app metadata information.
Optional: The scheme name of your app &lt;span class="o"&gt;(&lt;/span&gt;If you don&lt;span class="s1"&gt;'t need one, just hit Enter): AppDemo
[11:50:40]: '&lt;/span&gt;snapshot&lt;span class="s1"&gt;' not enabled.
[11:50:40]: '&lt;/span&gt;cocoapods&lt;span class="s1"&gt;' enabled.
[11:50:40]: '&lt;/span&gt;carthage&lt;span class="s1"&gt;' not enabled.
[11:50:40]: Created new file '&lt;/span&gt;./fastlane/Fastfile&lt;span class="s1"&gt;'. Edit it to manage your own deployment lanes.
[11:50:40]: fastlane will send the number of errors for each action to
[11:50:40]: https://github.com/fastlane/enhancer to detect integration issues
[11:50:40]: No sensitive/private information will be uploaded
[11:50:40]: Successfully finished setting up fastlane
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这部分会进行联网，并提示输入你的 Apple ID 来验证你的应用是否存在（没有也会帮你自动创建）并获取相应的关键信息，通过一系列的流程下来把获取的信息会创建一个 &lt;code&gt;fastlane&lt;/code&gt; 目录&lt;br&gt;
并并写入相应的文件（如果某些信息没有填写会忽略某些文件的生成）：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Fastfile&lt;/code&gt;: 核心文件，主要用于 cli 调用和处理具体的流程，&lt;a href="https://github.com/fastlane/fastlane/tree/master/fastlane/docs#fastfile"&gt;了解详情&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Appfile&lt;/code&gt;: 从 Apple Developer Portal 获取和项目相关的信息，&lt;a href="https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Appfile.md"&gt;了解详情&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Deliverfile&lt;/code&gt;: 从 iTunes Connect 获取和项目相关的信息，&lt;a href="https://github.com/fastlane/fastlane/blob/master/deliver/Deliverfile.md"&gt;了解详情&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;抛开其他的几个文件先不说，大家先把注意力放到刚创建好的 &lt;code&gt;Fastfile&lt;/code&gt; 文件上面（可能有变化，仅作参考），如果大家对 Ruby 有了解的话，它定义的 DSL 语言非常类似 &lt;a href="https://github.com/ruby/rake"&gt;rake&lt;/a&gt;，但流程上有参考的 &lt;a href="https://github.com/rspec/rspec"&gt;rspec&lt;/a&gt;，一旦不满足需求还可以使用 Ruby 代码来实现。单凭 DSL 语言来说就算对于 Ruby 没有基础的也能很快掌握，大多都是比较简单易懂的语法。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Customise this file, documentation can be found here:&lt;/span&gt;
&lt;span class="c1"&gt;# https://github.com/fastlane/fastlane/tree/master/fastlane/docs&lt;/span&gt;
&lt;span class="c1"&gt;# All available actions: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Actions.md&lt;/span&gt;
&lt;span class="c1"&gt;# can also be listed using the `fastlane actions` command&lt;/span&gt;

&lt;span class="c1"&gt;# Change the syntax highlighting to Ruby&lt;/span&gt;
&lt;span class="c1"&gt;# All lines starting with a # are ignored when running `fastlane`&lt;/span&gt;

&lt;span class="c1"&gt;# If you want to automatically update fastlane if a new version is available:&lt;/span&gt;
&lt;span class="c1"&gt;# update_fastlane&lt;/span&gt;

&lt;span class="c1"&gt;# This is the minimum version number required.&lt;/span&gt;
&lt;span class="c1"&gt;# Update this, if you use features of a newer version&lt;/span&gt;
&lt;span class="n"&gt;fastlane_version&lt;/span&gt; &lt;span class="s2"&gt;"1.95.0"&lt;/span&gt;

&lt;span class="n"&gt;default_platform&lt;/span&gt; &lt;span class="ss"&gt;:ios&lt;/span&gt;

&lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="ss"&gt;:ios&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="c1"&gt;# 执行所有命令前都会先执行这里&lt;/span&gt;
  &lt;span class="n"&gt;before_all&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;# ENV["SLACK_URL"] = "https://hooks.slack.com/services/..."&lt;/span&gt;
    &lt;span class="n"&gt;cocoapods&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;"Runs all the tests"&lt;/span&gt;
  &lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:test&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nb"&gt;scan&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;"Submit a new Beta Build to Apple TestFlight"&lt;/span&gt;
  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;"This will also make sure the profile is up to date"&lt;/span&gt;
  &lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:beta&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;# match(type: "appstore") # more information: https://codesigning.guide&lt;/span&gt;
    &lt;span class="n"&gt;gym&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;scheme: &lt;/span&gt;&lt;span class="s2"&gt;"AppDemo"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Build your app - more options available&lt;/span&gt;
    &lt;span class="n"&gt;pilot&lt;/span&gt;

    &lt;span class="c1"&gt;# sh "your_script.sh"&lt;/span&gt;
    &lt;span class="c1"&gt;# You can also use other beta testing services here (run `fastlane actions`)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;"Deploy a new version to the App Store"&lt;/span&gt;
  &lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:appstore&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;# match(type: "appstore")&lt;/span&gt;
    &lt;span class="c1"&gt;# snapshot&lt;/span&gt;
    &lt;span class="n"&gt;gym&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;scheme: &lt;/span&gt;&lt;span class="s2"&gt;"AppDemo"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Build your app - more options available&lt;/span&gt;
    &lt;span class="n"&gt;deliver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;force: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# frameit&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# 你可以定义属于自己的 lane（任务）&lt;/span&gt;
  &lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:hello&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"hello world"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# 仅当上述流程全部执行成功后才会走这里。其实应该定义为 after_success&lt;/span&gt;
  &lt;span class="n"&gt;after_all&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;lane&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="c1"&gt;# slack(&lt;/span&gt;
    &lt;span class="c1"&gt;#   message: "Successfully deployed new App Update."&lt;/span&gt;
    &lt;span class="c1"&gt;# )&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# 如果流程发生异常会走这里并终止&lt;/span&gt;
  &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;lane&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="c1"&gt;# slack(&lt;/span&gt;
    &lt;span class="c1"&gt;#   message: exception.message,&lt;/span&gt;
    &lt;span class="c1"&gt;#   success: false&lt;/span&gt;
    &lt;span class="c1"&gt;# )&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;通过上面的注解，我想大家对它已经有了初步的了解，那么定义完之后该如何执行呢？回到刚才的终端（关闭了？那再切换到刚才的 iOS 项目的根目录）：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane ios hello
&lt;span class="o"&gt;[&lt;/span&gt;11:56:24]: &lt;span class="nt"&gt;-------------------------------------------------&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11:56:24]: &lt;span class="nt"&gt;---&lt;/span&gt; Step: Verifying required fastlane version &lt;span class="nt"&gt;---&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11:56:24]: &lt;span class="nt"&gt;-------------------------------------------------&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11:56:24]: fastlane version valid
&lt;span class="o"&gt;[&lt;/span&gt;11:56:24]: &lt;span class="nt"&gt;------------------------------&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11:56:24]: &lt;span class="nt"&gt;---&lt;/span&gt; Step: default_platform &lt;span class="nt"&gt;---&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11:56:24]: &lt;span class="nt"&gt;------------------------------&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11:56:24]: Driving the lane &lt;span class="s1"&gt;'ios hello'&lt;/span&gt; 🚀
&lt;span class="o"&gt;[&lt;/span&gt;11:56:24]: &lt;span class="nt"&gt;-----------------------&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11:56:24]: &lt;span class="nt"&gt;---&lt;/span&gt; Step: cocoapods &lt;span class="nt"&gt;---&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11:56:24]: &lt;span class="nt"&gt;-----------------------&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11:56:24]: &lt;span class="nv"&gt;$ &lt;/span&gt;pod &lt;span class="nb"&gt;install&lt;/span&gt;
...
&lt;span class="o"&gt;[&lt;/span&gt;11:56:28]: hello world

+------+-------------------------------------+-------------+
|                     fastlane summary                     |
+------+-------------------------------------+-------------+
| Step | Action                              | Time &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;in &lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; |
+------+-------------------------------------+-------------+
| 1    | Verifying required fastlane version | 0           |
| 2    | default_platform                    | 0           |
| 3    | cocoapods                           | 4           |
+------+-------------------------------------+-------------+

&lt;span class="o"&gt;[&lt;/span&gt;11:56:28]: fastlane.tools finished successfully 🎉
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;哒哒！一个简单的任务执行完毕！&lt;/p&gt;

&lt;p&gt;如果大家注意观察上面的文件可能注意到一些小细节：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 自动更新 fastlane 工具，需要 rubygems &amp;gt;= 2.1.0&lt;/span&gt;
&lt;span class="n"&gt;update_fastlane&lt;/span&gt;

&lt;span class="c1"&gt;# 最低兼容版本，由于 fastlane 还是逐步健壮的阶段更新速度还是蛮快的，&lt;/span&gt;
&lt;span class="c1"&gt;# 为了防止新特性在旧版本的不支持会强制设置一个最低兼容版本&lt;/span&gt;
&lt;span class="c1"&gt;# 不过工具特别贴心的会在每次执行之后会检查是否有新版本，如果有会在最后末尾追加新版本提醒&lt;/span&gt;
&lt;span class="n"&gt;fastlane_version&lt;/span&gt; &lt;span class="s2"&gt;"1.95.0"&lt;/span&gt;

&lt;span class="c1"&gt;# 默认使用平台是 ios，也就是说文件可以定义多个平台，&lt;/span&gt;
&lt;span class="c1"&gt;# 通过上述执行的命令也能看出来是执行的 ios 平台下面的 hello 任务。&lt;/span&gt;
&lt;span class="c1"&gt;# 这个的作用是可以在执行 fastlane 的时候省略 ios，不信你执行 fastlane hello 试试。&lt;/span&gt;
&lt;span class="n"&gt;default_platform&lt;/span&gt; &lt;span class="ss"&gt;:ios&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Android 的支持
&lt;/h2&gt;

&lt;p&gt;这个的支持我觉得关键是社区的呼声太大，加上贡献者的热情（我提交过许多 issues 和个别 PL，响应非常的迅速）很快就加上了其支持，&lt;br&gt;
但具体的特性不是特别多，主要是对于 &lt;code&gt;gradle&lt;/code&gt; 的封装，我先不做展开介绍，大家可以先看看&lt;a href="https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Android.md"&gt;官方文档&lt;/a&gt;，如果后续有特别不明白的地方我在做具体的讲解。&lt;/p&gt;

&lt;p&gt;今天就先写到这里后续我会继续整理更多的使用指南和实战范例共大家参考，最后给大家附赠官方给大家的一些&lt;a href="https://github.com/fastlane/examples"&gt;范例&lt;/a&gt;。&lt;/p&gt;

</description>
      <category>fastlane</category>
      <category>ios</category>
      <category>android</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
