fastlane的使用及檔案編寫
背景
我們在開發過程中總免不了需要經歷發測、上傳等環節。這開發環節中,我們需要打不同環境的包,上傳對應的分發後臺(例如”蒲公英“、TestFlight、iTunes Connect)等。每次的手動打包的過程中,我們都要選擇對應的環境、對應打包的證書、正確的target等工作。萬一上述步驟哪一步選錯了,輕者得重新走一遍上述的流程,更嚴重點還有可能會把測試服的資料傳到正式服去了。仔細想想後患無窮。有沒有一種方法可以在設定好一系列的任務流程後,只需要一句程式碼就可以自動幫我們完成上面提及的一些列操作。既減少我們手動操作的同時,還能減少選擇環境證書導致錯誤的方法呢?有!fastlane就能幫到你。
fastlane
fastlane是一個自動化構建工具,主要包含測試、打包、釋出等功能,它內部是由ruby實現的,是一款自動化非常高的指令碼工具。
安裝
mac自帶的ruby,需要 sudo許可權
sudo gem install fastlane
初始化
在專案根目錄(通俗一點就是跟你.xcworkspace、Podfile檔案同級的t地方)下,初始化Fastlane:
fastlane init
在初始化完成後我們看到在根目錄下生成了一個fastlane
的資料夾還有一個Gemfile
檔案
-fastlane
-Fastfile(儲存有關開發者賬號相關資訊)
-Appfile(核心檔案,主要用於 命令列呼叫和處理具體的流程,lane相對於一個方法或者函式)
-Gemfile(Gemfile是我們建立的一個用於描述gem之間依賴的檔案。gem是一堆Ruby程式碼的集合,它能夠為我們提供呼叫)
複製程式碼
至此我們完成了第一步,fastlans的初始化。開啟Fastfile我們就可以看見fastlane的核心檔案了。
default_platform(:ios)
platform :ios do
desc "Description of what the lane does"
lane :custom_lane do
# add actions here: https://docs.fastlane.tools/actions
end
end
複製程式碼
我們只需要在命令列敲fastlane custom_lane
就可以執行這個自定義的任務。但當然由於我們啥都沒設定,他並不會有任何效果。
Fastfile檔案編寫
和我們iOS的ViewController一樣,fastlane也是有生命週期的。fastlane的生命週期為
執行順序 | 方法名 | 說明 |
---|---|---|
1 | before_all | 在執行 lane 之前只執行一次 |
2 | before_each | 每次執行 lane 之前都會執行一次 |
3 | lane | 自定義的任務 |
4 | after_each | 每次執行 lane 之後都會執行一次 |
5 | after_all | 在執行 lane 成功結束之後執行一次 |
6 | error | 在執行上述情況任意環境報錯都會中止並執行一次 |
lane
lane是fastfile中的方法定義標籤,可以理解為函式。fastlane 都是基於ruby,所以fastfile中也是使用ruby語法的。
定義一個簡單的無參lane
lane :noParam_lane
puts "這是一個無引數的lane"
end
複製程式碼
呼叫方法fastlane noParam_lane
定義一個帶參的lane,在fastfile中option類似於一個字典集。我們可以通過 option[:configuration] 取其中value
lane :param_lane do |option|
param = option[:param]
puts "這是一個有引數的lane"
puts param
end
複製程式碼
呼叫方法param_lane(param: '我是引數')
Action
除開我們自定義fastfile中的方法,fastlane還提供了很多已經寫好的獨立的方法庫,也就是Actions。
常見的action可以查閱Actions 或呼叫fastlane程式碼fastlane actions
舉例
下面我們舉一個簡單的打包例子
APP_NAME = "XXX"
SCHEME = "XXX"
platform :ios do
#在執行lane前先跑一遍cocoapods
before_all do
cocoapods
end
#debug包
lane :iosDebug do
package(configuration: "Debug",method:"development")
end
#release包
lane :iosRelease do
package(configuration: "Release",method:"ad-hoc")
end
#釋出包
lane :iosAppStore do
package(configuration: "Release",method:"app-store"")
end
#打包函式
lane :package do |option|
#打包
gym(
scheme: "#{SCHEME}",
export_method: option[:method],configuration: option[:configuration],include_symbols: true,include_bitcode: false,export_xcargs: "-allowProvisioningUpdates"
)
end
複製程式碼
首先我們在Fastfile中全域性定義了幾個引數分別用於儲存應用名、SCHEME等公用引數。在上一章節中我們說過fastlane的生命週期中有一個before_all(在執行 lane 之前只執行一次),我們在這個方法中先更新了一遍cocoaPods。然後定義了3個lane,分別對應我們開發過程中測試服發測、正式服發測、以及上傳appstore的3種打包流程。在流程中通過對configuration 和method 的傳參達到配置不同打包環境的效果。
switch lane
我們可以從程式碼中看到,iosDebug、iosRelease、iosAppStore 3個lane最後都呼叫了一個公用的lane package
。這種在一個lane中呼叫另一個lane的使用方式我們把它命名為switch lane
gym
gym其實是actionbuild_app
的別名。按照他的官方的說法,使用gym來構建ipa檔案,會比其他構建工具還要快30%(真香)。
gym的引數有非常多取幾個比較常用的來講一下
| 引數名 | 解釋 |預設值| |: --------: | :-----: | :----: | | workspace | workspace檔案的路徑| | | project | project檔案的路徑| | | scheme | 要打包專案的scheme| | | clean | 打包前要不要clean一下(最好還是clean一下吧,這個預設值是不clean的)|false | | output_directory | 打包後匯出的目錄|*(根目錄) | | output_name | 匯出ipa的名字| | | configuration | 打包的配置| ”Release”| | include_symbols | ipa檔案應包含符號表嗎| | | include_bitcode | ipa檔案應包含include_bitcode嗎| | | export_method | 匯出有效值的方法,有效值包括:app-store,ad-hoc,package,enterprise,development,developer-id| | 其他詳細的不常用的就不復制貼上了大家可以看build_app這裡 。
執行打包
有了上面對打包方法的封裝,我們只需要根據不同的打包需求。測試服發測呼叫iosDebug
;正式服發測呼叫iosRelease
;打appstore包呼叫iosAppStore
即可獲得我們想要的不同環境的包了。
上傳蒲公英
我們在發測過程中還有上傳到軟體分發後臺的操作,這個功能fastlane同樣幫我們封裝成外掛了。我們只需要在在終端中,輸入以下命令,即可安裝蒲公英的 fastlane 外掛。
fastlane add_plugin pgyer
安裝完畢後,我們在Fastfile裡需要上傳到蒲公英的lane中加入相應的命令即可在得到ipa包後直接上傳蒲公英
#debug包
lane :iosDebug do
package(configuration: "Debug",method:"development")
pgyer(api_key: "7f15xxxxxxxxxxxxxxxxxx141",user_key: "4a5bcxxxxxxxxxxxxxxx3a9e")
end
#release包
lane :iosRelease do
package(configuration: "Release",method:"ad-hoc")
pgyer(api_key: "7f15xxxxxxxxxxxxxxxxxx141",user_key: "4a5bcxxxxxxxxxxxxxxx3a9e")
end
複製程式碼
PS:api_key和user_key在蒲公英的後臺獲取。
最後再呼叫一下lane:
可以看到在執行完cocoaPods、打包、上傳蒲公英3個操作後。lane結束了任務!幫我們省了9分鐘呢!9分鐘打局王者他不香麼!拓展
有一個振奮人心的訊息是:fastlane支援Swift編寫了!!!Swift成為世界最好的語言指日可待!其實用法跟ruby版本類似,我也根據說明檔案寫了一下,如果是熟悉Swift程式碼編寫的同行應該很容易上手。但其實這個fastlane.swift只是基於ruby的封裝,並不是原生的Swift。但還是足以讓iOS開發者興奮的。不過侷限於當前的bate版本是不支援外掛的,因此像上文提及的上傳到蒲公英這些操作fastlane.swift還無法實現。所以實用性還是不能跟ruby原生版本相提並論的。或許將來的某天fastlane.swift正式版釋出可以解決這一問題,到時候我再補充Swift版本。Fastlane的開發者們加油吧!期待正式版釋出!
參考資料: