fastlane是一個自動化構(gòu)建工具年柠,主要包含測試、打包褪迟、發(fā)布等功能冗恨,它內(nèi)部是由ruby實現(xiàn)的,是一款自動化非常高的腳本工具味赃。
1. 常規(guī)使用
使用fastlane并不復(fù)雜掀抹,多數(shù)情況下,只需要一個命令和一個Fastfile配置文件心俗,就能使用fastlane去實現(xiàn)一些功能傲武,比如簽名、測試另凌、打包等
下面是一個Fastfile文件中的代碼谱轨,它的作用是打包程序。
default_platform :ios
lane :build do
gym(export_method: 'enterprise')
end
有了這個Fastfile文件之后吠谢,只需要在終端中執(zhí)行cd project_path
進入到項目主目錄土童,然后執(zhí)行fastlane build
,fastlane就會開始自動打包工坊。當然献汗,想要執(zhí)行成功敢订,那還需要提前把所有證書都配置正確了。
在使用fastlane時罢吃,一般分為兩步:
- 初始化
- 配置Fastfile
下面以這兩步分別來講解如何使用fastlane:
1.1. 初始化
在使用fastlane時楚午,一般是通過Fastfile這樣的配置文件來跟它交互的,所以第一步初始化的目的是創(chuàng)建Fastlane文件(如果有需要尿招,也可以創(chuàng)建其他類型的配置文件矾柜,如Appfile、Matchfile就谜、Gymfile等)怪蔑,具體而言,就是找到項目主目錄丧荐,也就是xcodeproj或xcworkspace所在的目錄下缆瓣,創(chuàng)建一個名叫fastlane或.fastlane的文件夾,在這個文件夾下虹统,創(chuàng)建配置文件Fastfile弓坞。目錄結(jié)構(gòu)如下:
-test.xcodeproj
-fastlane
-Fastfile
-Appfile
除了手動創(chuàng)建,fastlane也提供一個命令來簡化這個過程
fastlane init
1.2. 配置Fastfile
配置Fastfile主要是在其內(nèi)部創(chuàng)建各種lane车荔,這些lane的作用就是幫助你達到某一種目的渡冻,比如你可能有一個叫做appstore的lane,用來發(fā)布app到appstore的lane夸赫;或者一個叫做adhoc的類菩帝,用來發(fā)布測試版本咖城,等等茬腿,下面的例子中定義一個名叫build的lane,我們對它的期望打包app宜雀。
default_platform :ios
lane :build do
end
如果現(xiàn)在執(zhí)行fastlane build
切平,app并不會被打包,因為lane本身并沒有任何具體的功能辐董,它的作用是綁定各種具有特定功能的action悴品,讓這些action順序執(zhí)行。
那么简烘,為了達到打包app的作用苔严,需要在這個lane內(nèi)部添加一個具有打包功能的action,比如gym孤澎,代碼如下:
default_platform :ios
lane :build do
gym(export_method: 'enterprise')
end
到目前為止届氢,一個簡單的Fastfile文件就配置完了,然后你可以先測試一下覆旭,首先需要把證書設(shè)置好退子,然后在終端執(zhí)行cd project_path
進入項目主目錄岖妄,執(zhí)行fastlane build
,如果一切順利寂祥,打包完成后你會在項目主目錄得到一個ipa文件荐虐。
2. switch lane
switch lane 指的是在一個lane中調(diào)用另一個lane
default_platform :ios
lane :lane1 do
puts "lane1"
lane2
end
lane :lane2 do
puts "lane2"
end
例子中,lane1方法中調(diào)用了lane2丸凭,執(zhí)行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
可以看出,執(zhí)行是成功的惜犀,這說明fastlane支持lane之間相互調(diào)用忧换。
不過,在fastlane中向拆,并不是所有l(wèi)ane都能相互調(diào)用亚茬,需要滿足下面兩個條件之一:
- 兩個lane同屬于同一個platform
- 被調(diào)用的lane不屬于任何platform
那么,platform又是什么浓恳?
3. platform
首先刹缝,了解一下platform如何使用,F(xiàn)astfile的內(nèi)容如下:
platform :ios do
lane :lane1 do
puts "lane1"
end
lane :lane2 do
puts "lane2"
end
end
在這個例子中颈将,設(shè)置了兩個lane梢夯,名稱分別是lane1和lane2,這兩個lane被一個叫做ios的platform包圍晴圾。
platform的作用和lane的作用類似颂砸,lane的作用是綁定多個action,而platform則是綁定多個lane死姚。
由于fastlane目前可以在iOS人乓、android和Mac這三個平臺使用,所以可能在同一個Fastfile中存在不同平臺的lane都毒,使用platform可以使得lane的使用范圍更加明確色罚。還有一個需要注意的是,正如上一節(jié)所說的账劲,屬于不同platform的lane戳护,不能相互調(diào)用
如果需要在Android端使用fastlane,則可以額外添加一個叫做:android的platform瀑焦。另外腌且,也可以在platform之外添加lane,這種lane叫做通用lane榛瓮,可以被所有的lane調(diào)用铺董。
代碼如下:
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
這個時候,如果在終端執(zhí)行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喘鸟,那么不妨嘗試一下,執(zhí)行fastlane ios lane1
[?] ??
[16:21:29]: Driving the lane 'ios lane1' ??
[16:21:29]:
lane1
[16:21:29]: fastlane.tools finished successfully ??
成功了
經(jīng)過多次試驗驻右,可以發(fā)現(xiàn)當lane被定義在platform之內(nèi)時什黑,需要使用類似fastlane platform_name lane_name
的命令結(jié)構(gòu)來調(diào)用,比如調(diào)用lane1堪夭,則需要執(zhí)行fastlane ios lane1
愕把;調(diào)用lane3,則需要執(zhí)行fastlane android lane3
森爽;對于定義在platform之外的lane0恨豁,可以直接執(zhí)行fastlane lane0
。
4.default_platform
在實際使用中爬迟,很少有人會去執(zhí)行帶platform的命令橘蜜,一般是執(zhí)行命令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
現(xiàn)在计福,在這個例子中,執(zhí)行fastlane lane1
也可以成功調(diào)用lane1徽职。這是因為上面的例子中在設(shè)置了默認platform
default_platform :ios
5. action
action可以看作是fastlane中的功能模塊象颖,每一個action都有其特定的功能,它規(guī)定了功能的具體實現(xiàn)姆钉。比如之前例子中的gym
就是action说订,它是被用來打包工程的。
在fastlane中潮瓶,內(nèi)置了一系列的action陶冷,官方文檔中將這些內(nèi)置的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)
的格式就能執(zhí)行指定的action摸恍,其中options是一個Hash類型的值悉罕,所以也能寫成類似action_name(key1:value1,key2:value2)
的格式。
使用fastlane get_cert
執(zhí)行上述代碼立镶,fastlane會使用your_apple_id_username登錄到蘋果開發(fā)者網(wǎng)站查詢證書信息壁袄,如果本地鑰匙鏈中沒有安裝此賬號對應(yīng)證書,則fastlane會嘗試創(chuàng)建一個新的證書媚媒,如果創(chuàng)建成功嗜逻,fastlane會下載此證書并安裝到鑰匙鏈中,同時你也會得到對應(yīng)的CSR文件缭召、證書文件和其私鑰栈顷。
除此以外逆日,cert
這個action中有很多option可被設(shè)置,具體可執(zhí)行fastlane action cert
進行查詢萄凤。
6. 加載外部action
除了使用fastlane內(nèi)置的action以外室抽,還可以創(chuàng)建一些自定義action,并加載到fastlane中作為外部action靡努。
當需要為fastlane添加一些外部action時坪圾,只需要將這些自定義的action文件放在fastlane/actions/
路徑下即可,fastlane會自動加載惑朦。
具體目錄結(jié)構(gòu)如下:
-test.xcodeproj
-fastlane
-Fastfile
-Appfile
-actions
-your_action1.rb
-your_action2.rb
在Fastfile配置文件中兽泄,內(nèi)置的action和外部action的用法一致。
7. 加載plugin
plugin是什么漾月?
plugin實質(zhì)上就是由一些action組成的病梢,而且在加載到fastlane之后,這些action和其他action沒有什么區(qū)別梁肿,使用方法完全一致飘千。
plugin和外部action的區(qū)別?
如果你寫了一些自定義的action栈雳,想分享給其他人使用护奈,于是你提了一個PR給fastlane,但是fastlane由于一些原因沒有接受哥纫。這個時候你還有一條路可走霉旗,那就是創(chuàng)建一個包含這些action的plugin,并發(fā)布到RubyGems上蛀骇。
這里以加載fastlane-plugin-versioning為例厌秒,在fastlane/或fastlane/../路徑下執(zhí)行fastlane add_plugin versioning
即可,接下來你就能在Fastfile中使用這個plugin中包含的action了擅憔。
fastlane add_plugin plugin_name
的執(zhí)行結(jié)果是在fastlane/路徑下創(chuàng)建文件Pluginfile鸵闪,并修改Gemfile的內(nèi)容,以下是執(zhí)行命令之后Pluginfile和Gemfile中的內(nèi)容暑诸。
Pluginfile中內(nèi)容如下:
# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!
gem 'fastlane-plugin-versioning'
Gemfile中內(nèi)容如下
# 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)