0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Taskfile的安装及使用

马哥Linux运维 来源:mritd.com 作者:mritd.com 2022-07-18 16:22 次阅读

1. Taskfile 是什么

Taskfile 通过 yaml 来描述各种执行任务, 其核心采用 go 编写; 相较于 Makefile 的 tab 分割和 bash 结合语法 Taskfile 显得更加现代化和易于使用(虽然会变成 yaml 工程师). Taskfile 内置了动态变量、操作系统等环境变量识别等高级功能都更贴合现代化的 Coding 方式。

总体来说如果你是一个对 Makefile 不太熟悉的人, 又期望通过类似 Makefile 的工具完成一些批量任务, 那么相对于 Makefile 来说 Taskfile 会更加便于入门, 学习曲线更低且速度也足够快。

2. 安装及使用

安装 go-task

对于 mac 用户来说官方提供了 brew 安装方式:

$brewinstallgo-task/tap/go-task

对于 Linux 用户, 官方提供了部分 Linux 发行版的安装包, 但由于其只有一个二进制文件, 所以官方也提供了快速安装脚本:

#ForDefaultInstallationto./binwithdebuglogging
$sh-c"$(curl--locationhttps://taskfile.dev/install.sh)"---d

#ForInstallationTo/usr/local/binforuserwideaccesswithdebuglogging
#Mayrequiresudosh
$sh-c"$(curl--locationhttps://taskfile.dev/install.sh)"---d-b/usr/local/bin

如果本地已经有了 Go 语言开发环境也可以直接通过 go 命令安装:

$goinstallgithub.com/go-task/task/v3/cmd/task@latest

快速开始

安装完成后, 只需要编写一个Taskfile.yml的 yaml 文件, 然后就可以通过task命令运行相应的任务:

version:'3'

tasks:
build:
cmds:
-echo"执行build任务"

docker:
cmds:
-echo"打包docker镜像"
04df1606-0511-11ed-ba43-dac502259ad0.png

如果需要设置默认执行任务, 只需要创建一个名字为default的任务即可:

version:'3'

tasks:
default:
cmds:
-echo"这是默认任务"

build:
cmds:
-echo"执行build任务"

docker:
cmds:
-echo"打包docker镜像"
04ed2480-0511-11ed-ba43-dac502259ad0.png

3. 进阶使用

环境变量

Taskfile 支持引用三种环境变量:

  • Shell 环境变量
  • Taskfile 内定义的环境变量
  • 变量文件内定义的环境变量

如果需要引用 Shell 内的环境变量只需要使用$ 变量名方式直接引用即可:

version:'3'

tasks:
default:
cmds:
-echo"$ABCD"
0517049e-0511-11ed-ba43-dac502259ad0.png

同样在 Taskfile 内也可以定义环境变量:

version:'3'

env:
TENV2:"t2"#全局环境变量

tasks:
default:
cmds:
-echo"$TENV1"
-echo"$TENV2"
env:
TENV1:"t1"#单个task环境变量
05241b70-0511-11ed-ba43-dac502259ad0.png

除了这种直接引用变量的方式, Taskfile 也支持类似 docker-compose 一样读取 env 文件来加载环境变量;Taskfile 会默认加载同级目录下的.env文件, 也可以在 Taskfile 内通过dotenv命令来配置特定文件:

version:'3'

dotenv:[".env",".testenv"]

tasks:
default:
cmds:
-echo"$ABCD"
-echo"$TESTENV"
053e3de8-0511-11ed-ba43-dac502259ad0.png

增强变量

除了标准的环境变量以外, 在 Taskfile 中还内置了一种使用更加广泛的增强变量vars; 该变量模式可以通过 go 的模版引擎进行读取(插值引用), 且具有环境变量不具备的特殊特性. 以下为 vars 变量的示例:

version:'3'

#全局var变量
vars:
GLOBAL_VAR:"globalvar"

tasks:
testvar:
#taskvar变量
vars:
TASK_VAR:"taskvar"
cmds:
-"echo{{.GLOBAL_VAR}}"
-"echo{{.TASK_VAR}}"

除了上面与环境变量类似的使用以外, vars 增强变量还支持动态定义; 常见的场景, 比如我们想每次 task 执行时都获取当前的 git commit id, 此时可以使用 vars 的动态定义特性:

version:'3'

tasks:
build:
cmds:
-gobuild-ldflags="-Xmain.Version={{.GIT_COMMIT}}"main.go
vars:
#每次任务执行时,GIT_COMMIT都会调用shell命令来生成这个变量
GIT_COMMIT:
sh:gitlog-n1--format=%h

vars 变量还内置了一些特殊的预定义变量, 例如{{.TASK}}变量永远表示当前的任务名称、{{.CLI_ARGS}}可以引用命令行输入等.

version:'3'

tasks:
yarn:
cmds:
-yarn{{.CLI_ARGS}}

此时如果执行task yarn -- install, 那么{{.CLI_ARGS}}值将会变成install从而执行yarn install命令.

除此之外, vars 变量还具备一些其他特性, 比如跨任务引用时可进行覆盖传递等, 这些特性将会在后面介绍.

执行目录

Taskfile 内定义的 task 默认在当前目录下执行, 如果期望在其他目录执行, 无需手动编写cd等命令, 可以直接通过配置dir参数来设置执行目录:

version:'3'

tasks:
test1:
dir:/tmp#在指定目录执行
cmds:
-"ls"

任务依赖

在 CI 等环境的使用中, 我们常常需要定义任务的执行顺序和依赖关系; Taskfile 中通过deps配置来提供任务依赖关系的支持:

version:'3'

tasks:
build-jar:
cmds:
-echo"编译jar包..."
build-static:
cmds:
-echo"编译前端UI..."
build-docker:
deps:[build-jar,build-static]
cmds:
-echo"打包docker镜像..."

任务调用

当我们在 Taskfile 中定义了多个任务时, 很可能一些任务具有一定的相似性, 此时我们可以通过任务互相调用和 vars 变量动态覆盖的方式来定义模版 Task:

version:'3'

tasks:
docker:
cmds:
#-dockerbuild-t{{.IMAGE_NAME}}{{.BUILD_CONTEXT}}
-echo{{.IMAGE_NAME}}{{.BUILD_CONTEXT}}

build-backend:
cmds:
-task:docker#引用其他task
vars:{#动态传入变量
IMAGE_NAME:"backend",
BUILD_CONTEXT:"maven/target"
}

build-frontend:
cmds:
-task:docker
vars:{
IMAGE_NAME:"frontend",
BUILD_CONTEXT:"public"
}
default:#default用于在命令行不显示输入任何task名称时调用
cmds:
-task:build-backend
-task:build-frontend
054ed0c2-0511-11ed-ba43-dac502259ad0.png

引入其他文件

Taskfile 支持通过includes关键字来引入其他 Taskfile, 从而方便 Taskfile 的结构化处理.

需要注意的是, 由于引入的文件中可能会包含多特 task, 所以在使用时需要对引入的文件进行命名, 且通过命名引用目标 task:

version:'3'

includes:
file1:./file1.yaml#直接引用yaml文件
dir2:./dir2#引用目录时默认引用该目录下的Taskfile.yaml
057a0f26-0511-11ed-ba43-dac502259ad0.png

在引入其他 Taskfile 时,默认情况下会在当前主 Taskfile 目录下执行命令, 我们同样可以通过dir参数来控制引入的 Taskfile 内的 task 在特定目录下执行:

version:'3'

includes:
dir1:./dirtest.yaml#直接在当前目录执行
dir2:
taskfile:./dirtest.yaml
dir:/tmp#在指定目录执行
05877918-0511-11ed-ba43-dac502259ad0.png

defer 处理

熟悉 go 语言的同学应该知道, go 里面有个很方便的关键字defer; 该指令用于定义在最终代码收尾时要执行的动作, 常见的比如资源清理等. Taskfile 中同样支持了该指令, 可以方便我们在任务执行期间完成一些清理操作:

version:'3'

tasks:
default:#default用于在命令行不显示输入任何task名称时调用
cmds:
-wget-qhttps://github.com/containerd/nerdctl/releases/download/v0.19.0/nerdctl-full-0.19.0-linux-amd64.tar.gz
#定义清理动作
-defer:rm-fnerdctl-full-0.19.0-linux-amd64.tar.gz
-tar-zxfnerdctl-full-0.19.0-linux-amd64.tar.gz
05a10dba-0511-11ed-ba43-dac502259ad0.png

当然, defer 指令除了直接写命令以外, 还可以引用其他 task 完成清理:

version:'3'

tasks:
cleanup:
cmds:
-rm-f{{.FILE}}
default:#default用于在命令行不显示输入任何task名称时调用
cmds:
-wget-qhttps://github.com/containerd/nerdctl/releases/download/v0.19.0/nerdctl-full-0.19.0-linux-amd64.tar.gz
#引用其他task进行清理,同时也可以传递动态变量
-defer:{task:cleanup,vars:{FILE:nerdctl-full-0.19.0-linux-amd64.tar.gz}}
-tar-zxfnerdctl-full-0.19.0-linux-amd64.tar.gz

4. 高级应用

动态检测

输出检测

在某些时候, 一些任务我们可能期望进行缓存处理, 比如说已经下载好了文件就不要重复运行下载; 针对于这种需求, Taskfile 允许我们定义源文件和生成的文件, 通过这组文件的 hash 值来确定是否需要执行该任务:

version:'3'

tasks:
default:
cmds:
-wget-qhttps://github.com/containerd/nerdctl/releases/download/v0.19.0/nerdctl-full-0.19.0-linux-amd64.tar.gz
sources:
-testfile
generates:
-nerdctl-full-0.19.0-linux-amd64.tar.gz
05b21894-0511-11ed-ba43-dac502259ad0.png

从上图中可以看到, 当首次执行任务时会生成.task目录, 该目录包含文件的 hash 值; 当重复执行任务时, 如果 hash 值不改变则真实任务不会真正执行.Taskfile 默认有两种文件检测的方式:checksumtimestamp,checksum执行文件的 hash 检测(默认), 该模式只需要定义sources配置;timestamp执行文件的时间戳检测, 该模式需要同时定义sourcesgenerates配置.

version:'3'

tasks:
build:
cmds:
-gobuild.
sources:
-./*.go
generates:
-app{{exeExt}}
method:checksum#指定检测方式

除了内置的两种检测模式外, 我们还可以通过status配置来定义自己的检测命令,如果命令执行结果为 0, 则认为文件是最新的, 不需要执行任务:

version:'3'

tasks:
generate-files:
cmds:
-mkdirdirectory
-touchdirectory/file1.txt
-touchdirectory/file2.txt
#testexistenceoffiles
status:
-test-ddirectory
-test-fdirectory/file1.txt
-test-fdirectory/file2.txt

输入检测

上面的输出检测用于检测任务生成的文件结果等, 在某些情况下我们可能期望在运行任务之前来判断某个条件, 在完全不执行的情况下确定任务是否需要运行; 此时我们可以使用preconditions配置指令:

version:'3'

tasks:
generate-files:
cmds:
-mkdirdirectory
-touchdirectory/file1.txt
-touchdirectory/file2.txt
#testexistenceoffiles
preconditions:
-test-f.env
-sh:"[1=0]"
msg:"Onedoesn'tequalZero,Halting"

Go 模版引擎

在上面变量环节中已经展示了一部分模版引擎的使用, 实际上 Taskfile 内集成了slim-sprig[1]库, 该库中提供了一些比较便利的方法, 这些方法都可以在模版引擎内使用:

version:'3'

tasks:
print-date:
cmds:
-echo{{now|date"2006-01-02"}}

关于这些方法和模版引擎的使用具体请参考 Go Template 相关文档以及slim-sprig[2]文档.

交互式终端

有些任务命令可能需要交互式终端来执行, 此时可以为 task 设置interactive选项; 当interactive设置为true时, task 在运行时可以打开交互式终端:

version:'3'

tasks:
cmds:
-vimmy-file.txt
interactive:true

更多关于 Taskfile 的细节使用请阅读其官方文档[3], 本文限于篇幅不在过多阐述。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11204

    浏览量

    208702
  • Makefile
    +关注

    关注

    1

    文章

    125

    浏览量

    19158
  • go语言
    +关注

    关注

    1

    文章

    157

    浏览量

    9015

原文标题:Taskfile VS Makefile,构建工具哪家强?Taskfile 敢称王

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    openeuler安装教程三:openeuler安装步骤指导

    本章以光盘安装为例介绍安装openEuler,其他安装方式除在启动安装时的引导方式不同外,待启动安装后则
    的头像 发表于 12-06 16:53 1.5w次阅读
    openeuler<b class='flag-5'>安装</b>教程三:openeuler<b class='flag-5'>安装</b>步骤指导

    pads2005安装方法 安装说明 安装步骤

    pads2005安装方法 安装说明 安装步骤
    发表于 11-28 09:23 0次下载
    pads2005<b class='flag-5'>安装</b>方法 <b class='flag-5'>安装</b>说明 <b class='flag-5'>安装</b>步骤

    pads2007的安装方法 怎么安装 无法安装

    pads2007的安装方法 怎么安装  无法安装:图解说明,非常详细
    发表于 12-03 13:01 0次下载
    pads2007的<b class='flag-5'>安装</b>方法 怎么<b class='flag-5'>安装</b> 无法<b class='flag-5'>安装</b>

    轴承的安装

    轴承的安装 轴承的安装: 轴承的安装是否正确,影响着精度、寿命、性能。因此,设计及组装部门对于轴承的安装要充分研究。希望要按照作业标准进行安装
    发表于 05-14 08:10 893次阅读
    轴承的<b class='flag-5'>安装</b>

    PIII 的安装

    PIII 的安装   奔腾III的CPU安装
    发表于 01-12 11:27 670次阅读

    led吸顶灯如何安装安装教程)_led吸顶灯安装图解

    led灯饰越来越受大众喜欢,虽然led灯饰好看但是安装却是个大难题。那么它应该要如何安装呢?这篇文章主要就是介绍led吸顶灯的安装教程_led吸顶灯安装图解。
    发表于 12-22 14:00 31.8w次阅读

    PLC的安装准备和安装商检、调试、检查

    合理安排系统安装与调试程序,是确保高效优质地完成安装与调试任务的关键。
    的头像 发表于 12-25 08:51 2749次阅读

    RealViewMDK的安装概述和驱动安装

    本文的主要内容介绍的是RealViewMDK的安装概述和驱动安装
    发表于 05-09 09:15 16次下载

    QuartusII安装教程之QuartusII安装说明和硬件安装资料免费下载

    本文档的主要内容详细介绍的是QuartusII安装教程之QuartusII安装说明和硬件安装资料免费下载。
    发表于 03-27 17:12 11次下载
    QuartusII<b class='flag-5'>安装</b>教程之QuartusII<b class='flag-5'>安装</b>说明和硬件<b class='flag-5'>安装</b>资料免费下载

    指纹锁安装注意事项及安装步骤

    指纹锁怎么安装?指纹锁安装费用怎么算?安装指纹锁视频教程分享。在购买了指纹锁之后,怎么安装也是消费者要考虑的问题,虽然很多品牌有指纹锁安装
    发表于 06-13 11:55 1.1w次阅读

    Kali Linux安装Java 安装显卡驱动 安装网卡补丁 并发线程限制 电源优化

    Kali Linux安装Java 安装显卡驱动 安装网卡补丁 并发线程限制 电源优化安装Java安装Java
    发表于 01-06 16:18 0次下载
    Kali Linux<b class='flag-5'>安装</b>Java <b class='flag-5'>安装</b>显卡驱动 <b class='flag-5'>安装</b>网卡补丁 并发线程限制 电源优化

    OpenSSL安装使用:OpenSSL安装说明

    安装ActivePerl软件根据提示一步一步进行安装即可,安装过程软件会自动设置环境变量。要确认是否安装成功,我们可以利用cmd命令行的形式输入指令进入到
    的头像 发表于 11-11 14:11 1578次阅读

    openeuler安装教程二:openeuler安装方式介绍

    (HostOS为openEuler,虚拟化组件为发布包中的qemu、KVM)创建的虚拟化平台和华为公有云的x86虚拟化平台。 安装方式当前仅支持光盘、USB盘安装、网络安装、qcow2镜像安装
    的头像 发表于 12-06 16:48 4023次阅读
    openeuler<b class='flag-5'>安装</b>教程二:openeuler<b class='flag-5'>安装</b>方式介绍

    openeuler安装教程四:openeuler安装方法使用kickstart自动化安装

    使用kickstart自动化安装 使用kickstart自动化安装 总体介绍 概述 优缺点对比 背景知识 半自动化安装指导 环境要求 操作步骤 全自动化安装指导 环境要求 操作步骤 总
    的头像 发表于 12-06 17:22 6068次阅读
    openeuler<b class='flag-5'>安装</b>教程四:openeuler<b class='flag-5'>安装</b>方法使用kickstart自动化<b class='flag-5'>安装</b>

    安装Linux的系统安装工具

    安装_Linux的系统安装工具,可以安装各类Linux操作系统。通过iso镜像文件的格式安装。也可以安装在U盘上,本人亲测通过。  
    发表于 09-11 10:21 0次下载