fastlane 实现自定义Action
有的时候官方提供的所有的Action并不能满足我们的需求,这个时候就需要我们自己自定义Action用来调用了,我感觉这也是fastlane一个很好的扩展功能。
比如我们现在有这么一个场景,在使用fastlane更新远程的私有库或者共有库的时候,我们在给项目打tag的时候,先判断一下当前的项目是不是已经存在了相同名称的tag,如果有的话,删除掉,再进行下一步操作,如果没有的话,不执行我们的action。
如果对fastlane的action概念不是很熟悉的话,建议先看一下fastlane更新远程的私有库,里面有对Action操作和运用的相关示例。
创建自定义的Action步骤如下:
1、先创建一个ruby文件
1.1、首先进入到fastlane的目录下面
1.2、运行命令创建ruby文件
fastlane new_action
image.png
注意事项,自定义的action名字的命名规范如下:
Must be lower case, and use a '_' between words. Do not use '.'
examples: 'testflight', 'upload_to_s3'
2、认识下创建出来的文件的组成部分
3、修改创建出来的ruby文件,形成我们的自定义的Action脚本
3.1、说一下我们当前设计的Action的需求是,给出三个参数,
tag: tag号,字符串,不可省略
isRL: 是否要删除本地仓库的tag,Bool类型,可以省略,默认的参数是false
isRR: 是否要删除远程仓库的tag,Bool类型,可以省略,默认的参数是false
module Fastlane
module Actions
module SharedValues
REMOVE_TAG_CUSTOM_VALUE = :REMOVE_TAG_CUSTOM_VALUE
end
class RemoveTagAction < Action
def self.run(params)
# 最终要执行的东西,在这里执行
# 1、获取所有输入的参数
# tag 的名称 如 0.1.0
tageName = params[:tag]
# 是否需要删除本地标签
isRemoveLocationTag = params[:isRL]
# 是否需要删除远程标签
isRemoveRemoteTag = params[:isRR]
# 2、定义一个数组,准备往数组里面添加相应的命令
cmds = []
# 删除本地的标签
# git tag -d 标签名称
if isRemoveLocationTag
cmds << "git tag -d #{tageName}"
end
# 删除远程标签
# git push origin :标签名称
if isRemoveRemoteTag
cmds << "git push origin :#{tageName}"
end
# 3、执行数组里面的所有的命令
result = Actions.sh(cmds.join('&'))
UI.message("执行完毕 remove_tag的操作 🚀")
return result
end
#####################################################
# @!group Documentation
#####################################################
def self.description
"输入标签,删除标签"
end
def self.details
# Optional:
# this is your chance to provide a more detailed description of this action
"我们可以使用这个标签来删除git远程的标签\n 使用方式是:\n remove_tag(tag:tagName,isRL:true,isRR:true) \n或者 \nremove_tag(tag:tagName)"
end
# 接收相关的参数
def self.available_options
# Define all options your action supports.
# Below a few examples
[
# 传入tag值的参数描述,不可以忽略<必须输入>,字符串类型,没有默认值
FastlaneCore::ConfigItem.new(key: :tag,
description: "tag 号是多少",
optional:false,# 是不是可以省略
is_string: true, # true: 是不是字符串
),
# 是否删除本地标签
FastlaneCore::ConfigItem.new(key: :isRL,
description: "是否删除本地标签",
optional:true,# 是不是可以省略
is_string: false, # true: 是不是字符串
default_value: true), # 默认值是啥
# 是否删除远程标签
FastlaneCore::ConfigItem.new(key: :isRR,
description: "是否删除远程标签",
optional:true,# 是不是可以省略
is_string: false, # true: 是不是字符串
default_value: true) # 默认值是啥
]
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
# 支持平台
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、写完之后验证一下书写的格式是否正确
终端命令在fastlane的上级目录下执行
fastlane action remove_tag
image.png
4、调用使用
在我们的fastfile中写的lane中进行相关的调用,下面展示的是更新远程私有库的lane
调用代码
# 验证当前tag是否存在,如果说存在的话,干掉,进行下一步,创建一个tag,如果说不存在的话,直接创建tag
if git_tag_exists(tag: tagName)
UI.message("发现 tag:#{tagName} 存在,即将执行删除动作 🚀")
# 下面的两种写法都可以
remove_tag(tag:tagName,isRL:true,isRR:true)
#remove_tag(tag:tagName)
end
lane的整体代码
#################################################################
desc "通过 upgradePrivateSpec 可以快速的对远程私有库完成升级工作"
lane :upgradePrivateSpec do |options|
#外界输入的tag值
tagName = options[:tag]
specName = options[:specName]
podspecPath = "#{specName}.podspec"
#具体在这个文件上执行哪些行为
# 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
# 验证当前tag是否存在,如果说存在的话,干掉,进行下一步,创建一个tag,如果说不存在的话,直接创建tag
if git_tag_exists(tag: tagName)
UI.message("发现 tag:#{tagName} 存在,即将执行删除动作 🚀")
# 下面的两种写法都可以
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 检测当前spec的格式
pod_lib_lint(allow_warnings: true)
# pod repo push XXX xxxx.podspec
pod_push(path: podspecPath, repo: "PrivateSpecsGather", allow_warnings:true)
end
5、测试一下
5.1、为了测试,可以先把远程私有库添加上一个tag,然后再去运行我们的lane。看一下能不能把我们的本地的和远程的tag都给干掉。
运行lane
fastlane upgradePrivateSpec tag:0.1.8 specName:DownLoader repo:PrivateSpecsGather
注意:当前我们的代码tag已经存在0.1.8了。
image.png image.png大功告成。
其他的自定义的Action也可以这么进行创建。
如有失误请各位路过大神即时指点,或有更好的做法,也请指点一二。在下不甚感激。