Skip to content

模板参考

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 -race

CLI_ARGS_LIST

  • 类型[]string
  • 描述: 在 -- 之后传递的所有额外参数作为 shell 解析后的列表
yaml
tasks:
  docker-run:
    cmds:
      - docker run {{range .CLI_ARGS_LIST}}{{.}} {{end}}myapp

CLI_FORCE

  • 类型bool
  • 描述: 是否设置了 --force--force-all 标志
yaml
tasks:
  deploy:
    cmds:
      - |
        {{if .CLI_FORCE}}
        echo "已启用强制部署"
        {{end}}
        ./deploy.sh

CLI_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 "带换行符"}}'