iOS持續整合(三)——fastlane 自定義外掛

ChenJz發表於2019-02-26

fastlane的強大帶我們不少的便利,但事無人願。總有些不一樣的需求,今天就給大家帶來的是fastlaneaction和外掛。

這也是fastlane精髓部分,它使fastlane具有強大擴充套件性,以保證變化不斷的個性化需求。

自定義本地action

在專案中,可以建立自定義的action擴充套件fastlane的功能性。建立的這個actionfastlane內建的action在使用上面來說沒多大區別。下面來個例子:

建立本地action

更新 build 版本號,格式就以年月日時分。在終端輸入下面命令:

fastlane new_action
複製程式碼

action實現分析

在後面會被要求輸入action的名字,輸入update_build_version按回車後,fastlane會在fastlane/actions目錄下面建立字尾為.ruby檔案。請看下面的檔案內容

module Fastlane
  module Actions
    module SharedValues
      UPDATE_BUILD_VERSION = :UPDATE_BUILD_VERSION_CUSTOM_VALUE
    end

    class UpdateBuildVersionAction < Action

      def self.run(params) # 這個方法為Action的主方法,在這裡我們們寫入更新版本號的內容
        
        if params[:version_number]
          new_version = params[:version_number]
        else 
          # 格式化時間
          new_version = Time.now.strftime("%Y%M%d")
        end

        command = "agvtool new-vresion -all #{new_version}" #使用蘋果的 agvtool 工具更新版本號 

        Actions.sh(command) #執行上面的 shell 命令
        Actions.lane_context[SharedValues::UPDATE_BUILD_VERSION] = new_version # 更新全域性變數,供其他的Actions使用
        
      end

      def self.description  # 對於該Action小於80字元的簡短描述
        "A short description with <= 80 characters of what this action does"
      end

      def self.details # 對於該Action的詳細描述
        # Optional: 可選
      end

      def self.available_options # 定義外部輸入的引數,在這裡我們們定義一個指定版本號的引數
      
        [
          FastlaneCore::ConfigItem.new(key: :version_number, # run方法裡面根據該key獲取引數 
                                       env_name: "FL_UPDATE_BUILD_VERSION_VERSION_NUMBER", # 環境變數
                                       description: "Change to a specific version", # 引數簡短描述
                                       optional: true),
        ]
      end

      def self.output # 輸入值描述,如果在 run 方法更新 SharedValues 模組裡面自定義的變數,供其他的 Action 使用,可選
        [
          [`UPDATE_BUILD_VERSION_CUSTOM_VALUE`, `A description of what this value contains`]
        ]
      end

      def self.return_value # 返回值描述, 指的 run 方法會有返回值。可選
      end

      def self.authors # 作者
        ["ChenJzzz"]
      end

      def self.is_supported?(platform) # 支援的平臺
        # you can do things like
        # 
        #  true
        # 
        #  platform == :ios
        # 
        #  [:ios, :mac].include?(platform)
        # 

        platform == :ios
      end
    end
  end
end

複製程式碼

從上面的方法上來看,主要的還是run方法和available_options方法。如果看不懂上面的程式碼,那去補一下ruby相關的語法。OK,這個action跟其他的action一樣,在Fastlane直接使用就可以了。在終端輸入fastlane action update_build_version,會像下面一樣,列印出action的相關資訊

image

順便提一下要在另外的專案上使用,直接複製過去就行了。至於要提交到fastlane的官方庫,還是相對來說門檻較高。

自定義外掛

上面的action在共享這方面,只能靠複製這一手段,相當之不優雅。那麼外掛是我們最好的選擇。

建立外掛

進入一個新的目錄

fastlane new_plugin [plugin_name]
複製程式碼
  • fastlane 建立Ruby gem庫目錄
  • lib/fastlane/plugin/[plugin_name]/actions/[plugin_name].rb這個檔案是我們要實現的action檔案

外掛跟action都是同樣的寫法。在這裡就不重複描述了。

在當前目錄下, 可以執行fastlane test,測試外掛是否正確

使用方法

安裝已釋出到RubyGems的外掛
fastlane add_plugin [name]
複製程式碼

fastlane會執行以下步驟

  • 新增外掛到fastlane/Pluginfile
  • 使./Gemfile檔案正確引用fastlane/Pluginfile
  • 執行fastlane install_plugins安裝外掛以及需要的依賴
  • 如果之前未安裝過外掛,會生成三個檔案:GemfileGemfile.lockfastlane/Pluginfile
安裝其他外掛

正如上面所說,在專案裡面的fastlane/Pluginfile新增下面內容

# 安裝釋出到 Github 的外掛
gem "fastlane-plugin-example", git: "https://github.com/fastlane/fastlane-plugin-example"
# 安裝本地外掛
gem "fastlane-plugin-xcversion", path: "../fastlane-plugin-xcversion"
複製程式碼

在終端執行fastlane/Pluginfile(或者 bundle exec fastlane/Pluginfile),安裝外掛以及相關依賴

總結

action的出現,大大的增強了fastlane的擴充套件性。使我們適應自己的業務,定製所需要action。另外,Plugin使fastlane在有強大的擴充套件性同量,使用更加靈活。

總的來說,如果是單單的專案,action可以解決問題。如果是多個專案,使用plugins是不二選擇。

小Tips:如果看不懂,去補一下Ruby的語法。還有就是多點看一下網上action和plugin寫法。

參考文件:

Create Your Own Plugin(官方文件)

Available Plugins

相關文章