🧰 什么是 Task?
Task 是一个用 Go 编写的任务运行器和构建工具,旨在提供比 GNU Make 更简单易用的替代方案。
主要特点包括:
- 跨平台支持:兼容 Linux、macOS 和 Windows。
- 单一二进制文件:无需其他依赖,易于安装和使用。
- YAML 配置:使用直观的 YAML 文件定义任务。
- 自动化构建:适用于代码生成、构建、测试等自动化流程。)
🚀 安装 Task
使用 go install
安装
go install github.com/go-task/task/v3/cmd/task@latest
确保 $GOPATH/bin
或 $HOME/go/bin
已添加到系统的 PATH
环境变量中。
使用 Homebrew 安装(适用于 macOS)
brew install go-task/tap/go-task
验证安装
task --version
📄 创建 Taskfile
Task 使用名为 Taskfile.yml
或 Taskfile.yaml
的 YAML 文件定义任务。
示例 Taskfile
version: '3'
tasks:
hello:
desc: 打印问候语
cmds:
- echo "你好,Task!"
运行 task hello
将执行 hello
任务,输出:
你好,Task!
🛠️ Taskfile 配置详解
任务描述(desc)
为任务添加描述,便于使用 task --list
查看所有可用任务及其说明。
tasks:
build:
desc: 构建项目
cmds:
- go build -o bin/app .
命令列表(cmds)
每个任务可以包含一个或多个命令:
tasks:
test:
desc: 运行测试
cmds:
- go test ./...
- echo "测试完成"
依赖任务(deps)
定义任务的依赖关系,确保在执行当前任务前先执行其依赖任务:
tasks:
build:
desc: 构建项目
deps: [test]
cmds:
- go build -o bin/app .
在执行 build
任务前,会先执行 test
任务。
环境变量(env)
为任务设置环境变量:
tasks:
greet:
desc: 打印问候语
env:
NAME: "开发者"
cmds:
- echo "你好,$NAME!"
输出:
你好,开发者!
使用 .env
文件(dotenv)
Task 支持加载 .env
文件中的环境变量:
dotenv: ['.env']
tasks:
show_env:
desc: 显示环境变量
cmds:
- echo "当前环境:$ENV"
.env
文件内容:
ENV=开发
运行 task show_env
将输出:
当前环境:开发
变量(vars)
定义和使用变量:
tasks:
greet:
desc: 打印问候语
vars:
NAME: "开发者"
cmds:
- echo "你好,{{.NAME}}!"
输出:
你好,开发者!
也可以通过命令行传递变量:
task greet --NAME=测试者
输出:
你好,测试者!
条件执行(preconditions)
在执行任务前检查某些条件是否满足:
tasks:
deploy:
desc: 部署应用
preconditions:
- test -f config.yaml
cmds:
- echo "开始部署..."
如果 config.yaml
文件不存在,任务将不会执行。
📦 进阶功能
多任务文件(includes)
将任务拆分到多个文件中,便于管理:
includes:
frontend: ./frontend/Taskfile.yml
backend: ./backend/Taskfile.yml
调用子任务:
task frontend:build
默认任务(default)
定义默认任务,在不指定任务名时执行:
tasks:
default:
desc: 默认任务
cmds:
- echo "请指定要执行的任务"
运行 task
将输出:
请指定要执行的任务
静默模式(silent)
设置为 true
时,任务执行时不会输出命令本身,仅输出命令结果:
tasks:
hello:
desc: 打印问候语
silent: true
cmds:
- echo "你好,Task!"
任务别名(aliases)
为任务设置别名:
tasks:
build:
desc: 构建项目
aliases: [b]
cmds:
- go build -o bin/app .
现在可以使用 task b
来执行 build
任务。
🔄 与其他工具的对比
Task vs Make
- 语法:Task 使用 YAML,语法更直观;Make 使用特定语法,学习曲线较陡。
- 跨平台:Task 更好地支持 Windows;Make 在 Windows 上支持较差。
- 功能:Task 支持内置变量、环境变量、条件执行等高级功能。
Task vs Shell 脚本
- 可维护性:Task 的 YAML 配置更易读、易维护;Shell 脚本在复杂项目中难以管理。
- 重用性:Task 支持任务依赖和多任务文件,便于任务重用。
🧪 实战示例
示例 1:构建和运行 Go 应用
version: '3'
tasks:
build:
desc: 构建应用
cmds:
- go build -o bin/app .
run:
desc: 运行应用
deps: [build]
cmds:
- ./bin/app
运行 task run
将先构建应用,然后运行。
示例 2:前端项目任务管理
version: '3'
tasks:
install:
desc: 安装依赖
cmds:
- npm install
dev:
desc: 启动开发服务器
deps: [install]
cmds:
- npm run dev
build:
desc: 构建项目
deps: [install]
cmds:
- npm run build
运行 task dev
将安装依赖并启动开发服务器。
📚 参考资料
- 官方文档:https://taskfile.dev/
- GitHub 仓库:https://github.com/go-task/task