有的時(shí)候官方提供的所有的Action并不能滿足我們的需求,這個(gè)時(shí)候就需要我們自己自定義Action用來(lái)調(diào)用了尘应,我感覺(jué)這也是fastlane一個(gè)很好的擴(kuò)展功能。
比如我們現(xiàn)在有這么一個(gè)場(chǎng)景犬钢,在使用fastlane更新遠(yuǎn)程的私有庫(kù)或者共有庫(kù)的時(shí)候,我們?cè)诮o項(xiàng)目打tag的時(shí)候混滔,先判斷一下當(dāng)前的項(xiàng)目是不是已經(jīng)存在了相同名稱的tag,如果有的話遍坟,刪除掉晴股,再進(jìn)行下一步操作愿伴,如果沒(méi)有的話电湘,不執(zhí)行我們的action。
如果對(duì)fastlane的action概念不是很熟悉的話寂呛,建議先看一下fastlane更新遠(yuǎn)程的私有庫(kù),里面有對(duì)Action操作和運(yùn)用的相關(guān)示例贷痪。
創(chuàng)建自定義的Action步驟如下:
1、先創(chuàng)建一個(gè)ruby文件
1.1肉津、首先進(jìn)入到fastlane的目錄下面
1.2舱沧、運(yùn)行命令創(chuàng)建ruby文件
fastlane new_action
注意事項(xiàng),自定義的action名字的命名規(guī)范如下:
Must be lower case, and use a '_' between words. Do not use '.'
examples: 'testflight', 'upload_to_s3'
2熟吏、認(rèn)識(shí)下創(chuàng)建出來(lái)的文件的組成部分
3、修改創(chuàng)建出來(lái)的ruby文件悍引,形成我們的自定義的Action腳本
3.1、說(shuō)一下我們當(dāng)前設(shè)計(jì)的Action的需求是吗铐,給出三個(gè)參數(shù),
tag: tag號(hào)唬渗,字符串奋渔,不可省略
isRL: 是否要?jiǎng)h除本地倉(cāng)庫(kù)的tag镊逝,Bool類型嫉鲸,可以省略,默認(rèn)的參數(shù)是false
isRR: 是否要?jiǎng)h除遠(yuǎn)程倉(cāng)庫(kù)的tag,Bool類型座菠,可以省略,默認(rèn)的參數(shù)是false
module Fastlane
module Actions
module SharedValues
REMOVE_TAG_CUSTOM_VALUE = :REMOVE_TAG_CUSTOM_VALUE
end
class RemoveTagAction < Action
def self.run(params)
# 最終要執(zhí)行的東西拓萌,在這里執(zhí)行
# 1、獲取所有輸入的參數(shù)
# tag 的名稱 如 0.1.0
tageName = params[:tag]
# 是否需要?jiǎng)h除本地標(biāo)簽
isRemoveLocationTag = params[:isRL]
# 是否需要?jiǎng)h除遠(yuǎn)程標(biāo)簽
isRemoveRemoteTag = params[:isRR]
# 2微王、定義一個(gè)數(shù)組,準(zhǔn)備往數(shù)組里面添加相應(yīng)的命令
cmds = []
# 刪除本地的標(biāo)簽
# git tag -d 標(biāo)簽名稱
if isRemoveLocationTag
cmds << "git tag -d #{tageName}"
end
# 刪除遠(yuǎn)程標(biāo)簽
# git push origin :標(biāo)簽名稱
if isRemoveRemoteTag
cmds << "git push origin :#{tageName}"
end
# 3炕倘、執(zhí)行數(shù)組里面的所有的命令
result = Actions.sh(cmds.join('&'))
UI.message("執(zhí)行完畢 remove_tag的操作 ??")
return result
end
#####################################################
# @!group Documentation
#####################################################
def self.description
"輸入標(biāo)簽翰撑,刪除標(biāo)簽"
end
def self.details
# Optional:
# this is your chance to provide a more detailed description of this action
"我們可以使用這個(gè)標(biāo)簽來(lái)刪除git遠(yuǎn)程的標(biāo)簽\n 使用方式是:\n remove_tag(tag:tagName,isRL:true,isRR:true) \n或者 \nremove_tag(tag:tagName)"
end
# 接收相關(guān)的參數(shù)
def self.available_options
# Define all options your action supports.
# Below a few examples
[
# 傳入tag值的參數(shù)描述,不可以忽略<必須輸入>眶诈,字符串類型,沒(méi)有默認(rèn)值
FastlaneCore::ConfigItem.new(key: :tag,
description: "tag 號(hào)是多少",
optional:false,# 是不是可以省略
is_string: true, # true: 是不是字符串
),
# 是否刪除本地標(biāo)簽
FastlaneCore::ConfigItem.new(key: :isRL,
description: "是否刪除本地標(biāo)簽",
optional:true,# 是不是可以省略
is_string: false, # true: 是不是字符串
default_value: true), # 默認(rèn)值是啥
# 是否刪除遠(yuǎn)程標(biāo)簽
FastlaneCore::ConfigItem.new(key: :isRR,
description: "是否刪除遠(yuǎn)程標(biāo)簽",
optional:true,# 是不是可以省略
is_string: false, # true: 是不是字符串
default_value: true) # 默認(rèn)值是啥
]
end
def self.output
# Define the shared values you are going to provide
# Example
end
def self.return_value
# If your method provides a return value, you can describe here what it does
nil
end
def self.authors
# So no one will ever forget your contribution to fastlane :) You are awesome btw!
["zhangyan"]
end
# 支持平臺(tái)
def self.is_supported?(platform)
# you can do things like
#
# true
#
# platform == :ios
#
# [:ios, :mac].include?(platform)
#
platform == :ios
end
end
end
end
3.2东帅、寫完之后驗(yàn)證一下書寫的格式是否正確
終端命令在fastlane的上級(jí)目錄下執(zhí)行
fastlane action remove_tag
4球拦、調(diào)用使用
在我們的fastfile中寫的lane中進(jìn)行相關(guān)的調(diào)用靠闭,下面展示的是更新遠(yuǎn)程私有庫(kù)的lane
調(diào)用代碼
# 驗(yàn)證當(dāng)前tag是否存在坎炼,如果說(shuō)存在的話,干掉谣光,進(jìn)行下一步,創(chuàng)建一個(gè)tag萄金,如果說(shuō)不存在的話,直接創(chuàng)建tag
if git_tag_exists(tag: tagName)
UI.message("發(fā)現(xiàn) tag:#{tagName} 存在氧敢,即將執(zhí)行刪除動(dòng)作 ??")
# 下面的兩種寫法都可以
remove_tag(tag:tagName,isRL:true,isRR:true)
#remove_tag(tag:tagName)
end
lane的整體代碼
#################################################################
desc "通過(guò) upgradePrivateSpec 可以快速的對(duì)遠(yuǎn)程私有庫(kù)完成升級(jí)工作"
lane :upgradePrivateSpec do |options|
#外界輸入的tag值
tagName = options[:tag]
specName = options[:specName]
podspecPath = "#{specName}.podspec"
#具體在這個(gè)文件上執(zhí)行哪些行為
# 1、git pull
git_pull
# 2孙乖、pod install
cocoapods(
clean: true,
podfile: "./Example/Podfile"
)
# 3份氧、git add .
git_add(path: ".")
# git commit -m 'message'
git_commit(path: ".", message: "Version Bump")
# git push origin master
push_to_git_remote
# 驗(yàn)證當(dāng)前tag是否存在弯屈,如果說(shuō)存在的話,干掉资厉,進(jìn)行下一步,創(chuàng)建一個(gè)tag酌住,如果說(shuō)不存在的話阎抒,直接創(chuàng)建tag
if git_tag_exists(tag: tagName)
UI.message("發(fā)現(xiàn) tag:#{tagName} 存在,即將執(zhí)行刪除動(dòng)作 ??")
# 下面的兩種寫法都可以
remove_tag(tag:tagName,isRL:true,isRR:true)
#remove_tag(tag:tagName)
end
# 4且叁、git tag ...
add_git_tag(
tag: tagName
)
# git push --tags
push_git_tags
# 5、pod spec lint 檢測(cè)當(dāng)前spec的格式
pod_lib_lint(allow_warnings: true)
# pod repo push XXX xxxx.podspec
pod_push(path: podspecPath, repo: "PrivateSpecsGather", allow_warnings:true)
end
5逞带、測(cè)試一下
5.1、為了測(cè)試展氓,可以先把遠(yuǎn)程私有庫(kù)添加上一個(gè)tag,然后再去運(yùn)行我們的lane遇汞。看一下能不能把我們的本地的和遠(yuǎn)程的tag都給干掉空入。
運(yùn)行l(wèi)ane
fastlane upgradePrivateSpec tag:0.1.8 specName:DownLoader repo:PrivateSpecsGather
注意:當(dāng)前我們的代碼tag已經(jīng)存在0.1.8了。
大功告成化戳。
其他的自定義的Action也可以這么進(jìn)行創(chuàng)建埋凯。
如有失誤請(qǐng)各位路過(guò)大神即時(shí)指點(diǎn)点楼,或有更好的做法白对,也請(qǐng)指點(diǎn)一二。在下不甚感激躏结。