前言
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時,一般分為兩步:
- 初始化
- 配置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都能相互呼叫,需要滿足下面兩個條件之一:
- 兩個lane同屬於同一個platform
- 被呼叫的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分為了以下幾大類:
- Testing
- Building
- Screenshots
- Project
- Code Signing
- Documentation
- Beta
- Push
- Releasing your app
- Source Control
- Notifications
- Misc
- Deprecated
- Plugins
這裡以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)
複製程式碼