模板参考
Task 的模板引擎使用 Go 的 text/template 包进行值插值。本文档涵盖创建动态 Taskfile 的主要特性和所有可用函数。
基本用法
Task 中的大多数字符串值都可以使用双花括号 {{ 和 }} 进行模板化。花括号内的所有内容都会作为 Go 模板执行。
简单变量插值
yaml
version: '3'
tasks:
hello:
vars:
MESSAGE: 'Hello, World!'
cmds:
- 'echo {{.MESSAGE}}'输出:
Hello, World!条件逻辑
yaml
version: '3'
tasks:
maybe-happy:
vars:
SMILE: ':\)'
FROWN: ':\('
HAPPY: true
cmds:
- 'echo {{if .HAPPY}}{{.SMILE}}{{else}}{{.FROWN}}{{end}}'输出:
:)函数调用与管道
yaml
version: '3'
tasks:
uniq:
vars:
NUMBERS: '0,1,1,1,2,2,3'
cmds:
- 'echo {{splitList "," .NUMBERS | uniq | join ", "}}'输出:
0, 1, 2, 3循环控制流
yaml
version: '3'
tasks:
loop:
vars:
NUMBERS: [0, 1, 1, 1, 2, 2, 3]
cmds:
- |
{{range $index, $num := .NUMBERS}}
{{if gt $num 1}}{{break}}{{end}}
echo {{$index}}: {{$num}}
{{end}}输出:
0: 0
1: 1
2: 1
3: 1特殊变量
Task 提供了一些在模板中始终可用的特殊变量。这些变量会覆盖任何同名用户定义变量。
CLI
CLI_ARGS
- 类型:
string - 描述: 在
--之后传递的所有额外参数字符串
yaml
tasks:
test:
cmds:
- go test {{.CLI_ARGS}}bash
task test -- -v -race
# 运行: go test -v -raceCLI_ARGS_LIST
- 类型:
[]string - 描述: 在
--之后传递的所有额外参数作为 shell 解析后的列表
yaml
tasks:
docker-run:
cmds:
- docker run {{range .CLI_ARGS_LIST}}{{.}} {{end}}myappCLI_FORCE
- 类型:
bool - 描述: 是否设置了
--force或--force-all标志
yaml
tasks:
deploy:
cmds:
- |
{{if .CLI_FORCE}}
echo "已启用强制部署"
{{end}}
./deploy.shCLI_SILENT
- 类型:
bool - 描述: 是否设置了
--silent标志
CLI_VERBOSE
- 类型:
bool - 描述: 是否设置了
--verbose标志
CLI_OFFLINE
- 类型:
bool - 描述: 是否设置了
--offline标志
Task
TASK
- 类型:
string - 描述: 当前任务的名称
yaml
tasks:
build:
cmds:
- echo "正在运行任务 {{.TASK}}"ALIAS
- 类型:
string - 描述: 当前任务使用的别名,否则与
TASK匹配
TASK_EXE
- 类型:
string - 描述: Task 可执行文件名称或路径
yaml
tasks:
self-update:
cmds:
- echo "正在更新 {{.TASK_EXE}}"文件路径
ROOT_TASKFILE
- 类型:
string - 描述: 根 Taskfile 的绝对路径
ROOT_DIR
- 类型:
string - 描述: 根 Taskfile 目录的绝对路径
TASKFILE
- 极速赛车开奖号码查询结果历史记录-168飞艇官网开奖记录开奖历史:
string - 描述: 当前(包含的)Taskfile 的绝对路径
TASKFILE_DIR
- 类型:
string - 描述: 当前 Taskfile 目录的绝对路径
TASK_DIR
- 类型:
极速赛车开奖号码查询-168飞艇官网开奖现场直播string` - 描述: 任务执行的绝对路径
USER_WORKING_DIR
- 类型:
string - 描述: 调用
task时的绝对路径
yaml
tasks:
info:
cmds:
- echo "根目录 {{.ROOT_DIR}}"
- echo "当前 {{.TASKFILE_DIR}}"
- echo "工作目录 {{.USER极速赛车开奖号码查询结果历史记录-168飞艇官网开奖记录开奖历史_WORKING_DIR}}"状态
CHECKSUM
- 类型:
string - 描述:
sources中文件的校验和(仅在带有checksum方法的status中使用)
TIMESTAMP
- 类型:
time.Time - 描述:
sources中文件的最大时间戳(仅在带有timestamp方法的status中使用)
yaml
tasks:
build:
method: checksum
sources: ['**/*.go']
status:
- test "{{.CHECKSUM}}" = "$(cat .last-checksum)"
cmds:
- go build ./...
- echo "{{.CHECKSUM}}" > .last-checksum循环
ITEM
- 类型:
any - 描述: 使用
for属性时的当前迭代值
yaml
tasks:
greet:
cmds:
- for: [alice, bob, charlie]
cmd: echo "Hello {{.ITEM}}"可以使用 as 重命名:
yaml
tasks:
greet:
cmds:
- for:
var: NAMES
as: NAME
cmd: echo "Hello {{.NAME}}"延迟执行 (Defer)
EXIT_CODE
- 类型:
int - 描述: 失败命令的退出代码(仅在
defer中,且仅在非零时可用)
yaml
tasks极速赛车开奖号码查询-168飞艇官网开奖现场直播:
deploy:
cmds:
- ./deploy.sh
- defer: |
{{if .EXIT_CODE}}
echo "部署失败,代码 {{.EXIT_CODE}}"
./rollback.sh
{{end}}系统
TASK_VERSION
- 类型:
string - 描述: Task 的当前版本
yaml
tasks:
version:
cmds:
- echo "使用 Task {{.TASK_VERSION}}"可用函数
Task 提供了一套全面的模板函数。函数可以使用管道 (|) 链式调用,并可组合以提供强大的模板功能。
逻辑与控制流
and, or, not
用于条件逻辑的布尔运算
yaml
tasks:
conditional:
vars:
DEBUG: true
VERBOSE: false
PRODUCTION: false
cmds:
- echo "{{if and .DEBUG .VERBOSE}}调试模式带详细输出{{end}}"
- echo "{{if or .DEBUG .VERBOSE}}某种调试{{end}}"
- echo "{{if not .PRODUCTION}}开发构建{{end}}"eq, ne, lt, le, gt, ge极速赛车开奖号码查询-168飞艇官网开奖现场直播
比较运算
yaml
tasks:
compare:
vars:
VERSION: 3
cmds:
- echo "{{if gt .VERSION 2}}版本 3 或更高{{end}}"
- echo "{{if eq .VERSION 3}}正好是版本 3{{end}}"数据访问与操作
index
通过索引或键访问数组/映射元素
yaml
tasks:
access:
vars:
SERVICES: [api, web, worker]
CONFIG:
map:
database: postgres
port: 5432
cmds:
- echo "第一个服务 {{index .SERVICES 0}}"
- echo "数据库 {{index .CONFIG "database"}}"len
获取数组、映射或字符串的长度
yaml
tasks:
length:
vars:
ITEMS: [a, b, c, d]
TEXT: "Hello World"
cmds:
- echo "找到 {{len .ITEMS}} 个项目"
- echo "文本有 {{len .TEXT}} 个字符"slice
提取数组或字符串的一部分
yaml
tasks:
slice-demo:
vars:
ITEMS: [a, b, c, d, e]
cmds:
- echo "{{slice .ITEMS 1 3}}" # [b c]字符串函数
基本字符串操作
yaml
tasks:
string-basic:
vars:
MESSAGE: ' Hello World '
NAME: 'john doe'
TEXT: "Hello World"
cmds:
- echo "{{.MESSAGE | trim}}" # "Hello World"
- echo "{{.NAME | title}}" # "John Doe"
- echo "{{.NAME | upper}}" # "JOHN DOE"
- echo "{{.MESSAGE | lower}}" # "hello world"
- echo "{{.NAME | trunc 4}}" # "john"
- echo "{{"test" | repeat 3}}" # "testtesttest"
- echo "{{substr .TEXT 0 5}}" # "Hello"字符串测试与搜索
yaml
tasks:
string-test:
vars:
FILENAME: 'app.tar.gz'
EMA极速赛车开奖号码查询-168飞艇官网开奖现场直播IL: 'user@example.com'
cmds:
- echo "{{.FILENAME | hasPrefix "app"}}" # true
- echo "{{.FILENAME | hasSuffix ".gz"}}" # true
极速赛车开奖号码查询结果历史记录-168飞艇官网开奖记录开奖历史 - echo "{{.EMAIL | contains "@"}}" # true字符串替换与格式化
yaml
tasks:
string-format:
vars:
TEXT: 'Hello, World!'
UNSAFE: 'file with spaces.txt'
cmds:
- echo "{{.TEXT | replace "," ""}}" # "Hello World!"
- echo "{{.TEXT | quote}}" # "\"Hello, World!\""
- echo "{{.UNSAFE | shellQuote}}" # Shell 安全引用
- echo "{{.UNSAFE | q}}" # shellQuote 的简短别名正则表达式
yaml
tasks:
regex:
vars:
EMAIL: 'user@example.com'
TEXT: 'abc123def456'
cmds:
- echo "{{regexMatch "@" .EMAIL}}" # true
- echo "{{regexFind "[0-9]+" .TEXT}}" # "123"
- echo "{{regexFindAll "[0-9]+" .TEXT -1}}" # ["123", "456"]
- echo "{{regexReplaceAll "[0-9]+" .TEXT "极速赛车开奖号码查询结果历史记录-168飞艇官网开奖记录开奖历史X"}}" # "abcXdefX"列表函数
列表访问与基本操作
yaml
tasks:
list-basic:
vars:
ITEMS: ["apple", "banana", "cherry", "date"]
cmds:
- echo "第一个 {{.ITEMS | first}}" # "apple"
- echo "最后一个 {{.ITEMS | last}}" # "date"
- echo "其余部分 {{.ITEMS | rest}}" # ["banana", "cherry", "date"]
- echo "初始部分 {{.ITEMS | initial}}" # ["apple", "banana", "cherry"]
- echo "长度 {{.ITEMS | len}}" # 4列表操作
yaml
tasks:
list-manipulate:
vars:
NUMBERS: [3, 1, 4, 1, 5, 9, 1]
FRUITS: ["apple", "banana"]
cmds:
- echo "{{.NUMBERS | uniq}}" # [3, 1, 4, 5, 9]
- echo "{{.NUMBERS | sortAlpha}}" # [1, 1, 1, 3, 4, 5, 9]
- echo"'{{append .FRUITS "cherry"}}"" # ["apple", "banana", "cherry"]
- echo "{{ without .NUMBERS 1}}" # [3, 4, 5, 9]
- echo "{{.NUMBERS | has 5}}" # true字符串列表
yaml
tasks:
string-lists:
vars:
CSV: 'apple,banana,cherry'
WORDS: ['hello', 'world', 'from', 'task']
MULTILINE: |
line1
line2
line3
cmds:
- echo "{{.CSV | splitList ","}}" # ["apple", "banana", "cherry"]
- echo "{{.WORDS | join " "}}" # "hello world from task"
- echo "{{.WORDS | sortAlpha}}" # ["from", "hello", "task", "world"]
- echo "{{.MULTILINE | splitLines}}" # 按换行符分割(Unix/Windows)
- echo "{{.MULTILINE | catLines}}" # 用空格替换换行符Shell 参数解析
yaml
tasks:
shell-args:
vars:
ARGS: 'file1.txt -v --output="result file.txt"'
cmds:
- |
{{range .ARGS | splitArgs}}
echo "参数: {{.}}"
{{end}}数学函数
yaml
tasks:
math:
vars:
A: 10
B: 3
NUMBERS: [1, 5, 3, 9, 2]
cmds:
- echo "加法 {{add .A .B}}" # 13
- echo "减法 {{sub .A .B}}" # 7
- echo "乘法 {{mul .极速赛车开奖号码查询-168飞艇官网开奖现场直播A .B}}" # 30
- echo "除法 {{div .A .B}}" # 3
- echo "取模 {{mod .A .B}}" # 1
- echo "最大值 {{.NUMBERS | max}}" # 9
- echo "最小值 {{.NUMBERS | min}}" # 1
- echo "随机数 1-99 {{randInt 1 100}}" # 随机数
- echo "随机数 0-999 {{randIntN 1000}}" # 随机数 0-999日期与时间函数
yaml
tasks:
date-time:
vars:
BUILD_DATE: "2023-12-25"
cmds:
- echo "现在 {{now | date "2006-01-02 15:04:05"}}"
- echo {{ toDate "2006-01-02" .BUILD_DATE }}
- echo "构建 {{.BUILD_DATE | toDate "2006-01-极速赛车开奖号码查询结果历史记录-168飞艇官网开奖记录开奖历史02" | date "Jan 2, 2006"}}"
- echo "Unix 时间戳 {{now | unixEpoch}}"
- echo "多久之前 {{now | ago}}"系统函数
平台信息
yaml
tasks:
platform:
cmds:
- echo "操作系统 {{OS}}" # linux, darwin, windows 等
- echo "架构 {{ARCH}}" # amd64, arm64 等
- echo "CPU 核心数 {{numCPU}}" # CPU 核心数量
- echo "正在为 {{OS}}/{{ARCH}} 构建"路径函数
yaml
tasks:
paths:
vars:
WIN_PATH: 'C:\Users\name\file.txt'
OUTPUT_DIR: 'dist'
BINARY_NAME: 'myapp'
cmds:
- echo "{{.WIN_PATH | toSlash}}" # 转换为正斜杠
- echo "{{.WIN_PATH | fromSlash}}" # 转换为操作系统特定的斜杠
- echo "{{joinPath .OUTPUT_DIR .BINARY_NAME}}" # 连接路径元素
- echo "相对路径 {{relPath .ROOT_DIR .TASKFILE_DIR}}" # 获取相对路径数据结构函数
字典操作
yaml
tasks:
dict:
vars:
CONFIG:
map:
database: postgres
port: 5432
ssl: true
cmds:
- echo "数据库 {{.CONFIG | get "database"}}"
- echo "键 {{.CONFIG | keys}}"
- echo "有 SSL {{.CONFIG | hasKey "ssl"}}"
- echo "{{dict "env" "prod" "debug" false}}"合并与组合
yaml
tasks:
merge:
vars:
BASE_CONFIG:
map:
timeout: 30
retries: 3
USER_CONFIG:
map:
timeout: 60
debug: true
cmds:
- echo "{{merge .BASE_CONFIG .USER_CONFIG | toJson}}"默认值与合并
yaml
tasks:
defaults:
vars:
API_URL: ""
DEBUG: false
ITEMS: []
cmds:
- echo "{{.API_URL | default "http://localhost:8080"}}"
- echo "{{.DEBUG | default true}}"
- echo "{{.MISSING_VAR | default "fallback"}}"
- echo "{{coalesce .API_URL .FALLBACK_URL "default"}}"
- echo "是否为空 {{empty .ITEMS}}" # true编码与序列化
JSON
yaml
tasks:
json:
vars:
DATA:
map:
name: 'Task'
version: '3.0'
JSON_STRING: '{"key": "value", "number": 42}'
cmds:
- echo "{{.DATA | toJson}}"
- echo "{{.DATA | toPrettyJson}}"
- echo "{{.JSON_STRING | fromJson }}"YAML
yaml
tasks:
yaml:
vars:
CONFIG:
map:
database:
host: localhost
port: 5432
YAML_STRING: |
key: value
items:
- one
- two
cmds:
- echo "{{.CONFIG | toYam极速赛车开奖号码查询-168飞艇官网开奖现场直播l}}"
- echo "{{.YAML_STRING | fromYaml}}"Base64
yaml
tasks:
base64:
极速赛车开奖号码查询结果历史记录-168飞艇官网开奖记录开奖历史 vars:
SECRET: 'my-secret-key'
cmds:
- echo "{{.SECRET | b64enc}}" # 编码为 base64
- echo "{{"bXktc2VjcmV0LWtleQ==" | b64dec}}" # 从 base64 解码类型转换
yaml
tasks:
convert:
vars:
NUM_STR: '42'
FLOAT_STR: '3.14'
BOOL_STR: 'true'
ITEMS: [1, 2, 3]
cmds:
- echo "{{.NUM_STR | atoi | add 8}}" # 字符串转 int: 50
- echo "{{.FLOAT_STR | float64}}" # 字符串转 float: 3.14
- echo "{{.ITEMS | toStrings}}" # 转换为字符串: ["1", "2", "3"]实用函数
UUID 生成
yaml
tasks:
generate:
vars:
DEPLOYMENT_ID: "{{uuid}}"
cmds:
- echo "部署 ID {{.DEPLOYMENT_ID}}"调试
yaml
tasks:
debug:
vars:
COMPLEX_VAR:
map:
items: [1, 2, 3]
nested:
key: value
cmds:
- echo "{{spew .COMPLEX_VAR}}" # 美观打印用于调试输出函数
格式化输出
yaml
tasks:
output:
vars:
VERSION: "1.2.3"
BUILD: 42
cmds:
- echo '{{print "简单输出"}}'
- echo '{{printf "版本 %s.%d" .VERSION .BUILD}}'
- echo '{{println "带换行符"}}'