Fastlane(一):用法

wangzzzzz發表於2018-06-12

前言

fastlane是一個自動化構建工具,主要包含測試、打包、釋出等功能,它內部是由ruby實現的,是一款自動化非常高的指令碼工具。

1. 常規使用

使用fastlane並不複雜,多數情況下,只需要一個命令和一個Fastfile配置檔案,就能使用fastlane去實現一些功能,比如簽名、測試、打包等 下面是一個Fastfile檔案中的程式碼,它的作用是打包程式。

default_platform :ios

lane :build do
    gym(export_method: 'enterprise')
end
複製程式碼

有了這個Fastfile檔案之後,只需要在終端中執行cd project_path進入到專案主目錄,然後執行fastlane build,fastlane就會開始自動打包。當然,想要執行成功,那還需要提前把所有證書都配置正確了。

在使用fastlane時,一般分為兩步:

  1. 初始化
  2. 配置Fastfile

下面以這兩步分別來講解如何使用fastlane:

1.1. 初始化

在使用fastlane時,一般是通過Fastfile這樣的配置檔案來跟它互動的,所以第一步初始化的目的是建立Fastlane檔案(如果有需要,也可以建立其他型別的配置檔案,如Appfile、Matchfile、Gymfile等),具體而言,就是找到專案主目錄,也就是xcodeproj或xcworkspace所在的目錄下,建立一個名叫fastlane或.fastlane的資料夾,在這個資料夾下,建立配置檔案Fastfile。目錄結構如下:

-test.xcodeproj
-fastlane
  -Fastfile
  -Appfile
複製程式碼

除了手動建立,fastlane也提供一個命令來簡化這個過程

fastlane init
複製程式碼

1.2. 配置Fastfile

配置Fastfile主要是在其內部建立各種lane,這些lane的作用就是幫助你達到某一種目的,比如你可能有一個叫做appstore的lane,用來發布app到appstore的lane;或者一個叫做adhoc的類,用來發布測試版本,等等,下面的例子中定義一個名叫build的lane,我們對它的期望打包app。

default_platform :ios

lane :build do
end
複製程式碼

如果現在執行fastlane build,app並不會被打包,因為lane本身並沒有任何具體的功能,它的作用是繫結各種具有特定功能的action,讓這些action順序執行。 那麼,為了達到打包app的作用,需要在這個lane內部新增一個具有打包功能的action,比如gym,程式碼如下:

default_platform :ios

lane :build do
    gym(export_method: 'enterprise')
end
複製程式碼

到目前為止,一個簡單的Fastfile檔案就配置完了,然後你可以先測試一下,首先需要把證書設定好,然後在終端執行cd project_path進入專案主目錄,執行fastlane build,如果一切順利,打包完成後你會在專案主目錄得到一個ipa檔案。

2. switch lane

switch lane 指的是在一個lane中呼叫另一個lane

default_platform :ios

lane :lane1 do
    puts "lane1"
    lane2
end 
    
lane :lane2 do
    puts "lane2"
end 
複製程式碼

例子中,lane1方法中呼叫了lane2,執行fastlane lane1,部分輸出如下

[✔] ? 
[16:09:47]: Driving the lane 'lane1' ?
[16:09:47]: --------------------------------------
[16:09:47]: --- Step: Switch to lane2 lane ---
[16:09:47]: --------------------------------------
[16:09:47]: Cruising over to lane 'lane2' ?
[16:09:47]: Cruising back to lane 'lane1' ?
[16:09:47]: 
lane1
lane2
複製程式碼

可以看出,執行是成功的,這說明fastlane支援lane之間相互呼叫。 不過,在fastlane中,並不是所有lane都能相互呼叫,需要滿足下面兩個條件之一:

  1. 兩個lane同屬於同一個platform
  2. 被呼叫的lane不屬於任何platform

那麼,platform又是什麼?

3. platform

首先,瞭解一下platform如何使用,Fastfile的內容如下:

platform :ios do
    lane :lane1 do
        puts "lane1"
    end 
    
    lane :lane2 do
        puts "lane2"
    end 
end
複製程式碼

在這個例子中,設定了兩個lane,名稱分別是lane1和lane2,這兩個lane被一個叫做ios的platform包圍。

platform的作用和lane的作用類似,lane的作用是繫結多個action,而platform則是繫結多個lane。 由於fastlane目前可以在iOS、android和Mac這三個平臺使用,所以可能在同一個Fastfile中存在不同平臺的lane,使用platform可以使得lane的使用範圍更加明確。還有一個需要注意的是,正如上一節所說的,屬於不同platform的lane,不能相互呼叫

如果需要在Android端使用fastlane,則可以額外新增一個叫做:android的platform。另外,也可以在platform之外新增lane,這種lane叫做通用lane,可以被所有的lane呼叫。

程式碼如下:

lane :lane0 do
    puts "\nlane0"
end

platform :ios do
    lane :lane1 do
        puts "\nlane1"
    end 
    
    lane :lane2 do
        puts "\nlane2"
    end 
end

platform :android do
    lane :lane3 do
        puts "\nlane3"
    end 
    
    lane :lane4 do
        puts "\nlane4"
    end 
end
複製程式碼

這個時候,如果在終端執行fastlane lane1,fastlane會告訴你它找不到lane1

[!] Could not find 'lane1'. Available lanes: lane0, ios lane1, ios lane2, android lane3, android lane4
複製程式碼

但是,fastlane在錯誤資訊裡面指出可用的lanes有這些:lane0, ios lane1, ios lane2, android lane3, android lane4,那麼不妨嘗試一下,執行fastlane ios lane1

[✔] ? 
[16:21:29]: Driving the lane 'ios lane1' ?
[16:21:29]: 
lane1
[16:21:29]: fastlane.tools finished successfully ?
複製程式碼

成功了

經過多次試驗,可以發現當lane被定義在platform之內時,需要使用類似fastlane platform_name lane_name的命令結構來呼叫,比如呼叫lane1,則需要執行fastlane ios lane1;呼叫lane3,則需要執行fastlane android lane3;對於定義在platform之外的lane0,可以直接執行fastlane lane0

4.default_platform

在實際使用中,很少有人會去執行帶platform的命令,一般是執行命令fastlane lane_name,這是因為fastlane還提供了另一個方法:default_platform

default_platform :ios

lane :lane0 do
    puts "\nlane0"
end

platform :ios do
    lane :lane1 do
        puts "\nlane1"
    end 
    
    lane :lane2 do
        puts "\nlane2"
    end 
end

platform :android do
    lane :lane3 do
        puts "\nlane3"
    end 
    
    lane :lane4 do
        puts "\nlane4"
    end 
end
複製程式碼

現在,在這個例子中,執行fastlane lane1也可以成功呼叫lane1。這是因為上面的例子中在設定了預設platform

default_platform :ios
複製程式碼

5. action

action可以看作是fastlane中的功能模組,每一個action都有其特定的功能,它規定了功能的具體實現。比如之前例子中的gym就是action,它是被用來打包工程的。

在fastlane中,內建了一系列的action,官方文件中將這些內建的action分為了以下幾大類:

這裡以cert這個action作為例子,來簡單瞭解action一般如何使用。 Fastfile中的程式碼如下

default_platform :ios

platform :ios do
    lane :get_cert do
        cert(username: your_apple_id_username, development:false)
    end
end
複製程式碼

如上述程式碼所示,只要使用類似action_name(options)的格式就能執行指定的action,其中options是一個Hash型別的值,所以也能寫成類似action_name(key1:value1,key2:value2)的格式。

使用fastlane get_cert執行上述程式碼,fastlane會使用your_apple_id_username登入到蘋果開發者網站查詢證書資訊,如果本地鑰匙鏈中沒有安裝此賬號對應證書,則fastlane會嘗試建立一個新的證書,如果建立成功,fastlane會下載此證書並安裝到鑰匙鏈中,同時你也會得到對應的CSR檔案、證書檔案和其私鑰。 除此以外,cert這個action中有很多option可被設定,具體可執行fastlane action cert進行查詢。

6. 載入外部action

除了使用fastlane內建的action以外,還可以建立一些自定義action,並載入到fastlane中作為外部action。 當需要為fastlane新增一些外部action時,只需要將這些自定義的action檔案放在fastlane/actions/路徑下即可,fastlane會自動載入。 具體目錄結構如下:

-test.xcodeproj
-fastlane
  -Fastfile
  -Appfile
  -actions
    -your_action1.rb
    -your_action2.rb
複製程式碼

在Fastfile配置檔案中,內建的action和外部action的用法一致。

7. 載入plugin

plugin是什麼? plugin實質上就是由一些action組成的,而且在載入到fastlane之後,這些action和其他action沒有什麼區別,使用方法完全一致。

plugin和外部action的區別? 如果你寫了一些自定義的action,想分享給其他人使用,於是你提了一個PR給fastlane,但是fastlane由於一些原因沒有接受。這個時候你還有一條路可走,那就是建立一個包含這些action的plugin,併發布到RubyGems上。

這裡以載入fastlane-plugin-versioning為例,在fastlane/或fastlane/../路徑下執行fastlane add_plugin versioning即可,接下來你就能在Fastfile中使用這個plugin中包含的action了。

fastlane add_plugin plugin_name的執行結果是在fastlane/路徑下建立檔案Pluginfile,並修改Gemfile的內容,以下是執行命令之後Pluginfile和Gemfile中的內容。

Pluginfile中內容如下:

# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!

gem 'fastlane-plugin-versioning'

複製程式碼

Gemfile中內容如下

# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!

source "https://rubygems.org"

gem 'fastlane'

plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)

複製程式碼

相關文章