Taskfile 版本

Taskfile 的语法和功能随时间演变。这篇文档描述了每个版本的变化, 以及如何升级旧的 Taskfile。

Taskfile 的版本意味着什么

Taskfile 的版本是绑定 Task 的版本的。 例如 Taskfile 使用版本 2, 表示 Task 应该使用 v2.0.0 版本来执行。

Taskfile 文件的 version: 关键字接受语义化字符串, 所以 2, 2.02.0.0 都可以。 如果使用版本号 2.0,那么 Task 就不会使用 2.1 的功能, 但如果使用版本号 2, 那么任意 2.x.x 版本中的功能都是可用的, 但 3.0.0+ 的功能不可用。

版本 1

注意:Task v3.0.0 以后就不再支持 Taskfiles 的 1 版本了。

最初的 Taskfile 并不支持 version: 关键字, 因为 YAML 文档中的根属性都是 task,例如:

echo:
  cmds:
    - echo "Hello, World!"

变量的优先级也不同:

  1. 调用变量
  2. 系统环境变量
  3. Task 内变量
  4. Taskvars.yml 定义变量

版本 2.0

到了 2.0 版本,我们引入了 version: 关键字, 在不破坏已存在的 Taskfiles 的前提下, 在 Task 中引入新功能。新语法如下:

version: "2"

tasks:
  echo:
    cmds:
      - echo "Hello, World!"

2.0 版本允许直接在 Taskfile 中定义全局变量, 如果不想创建 Taskvars.yml 文件:

version: "2"

vars:
  GREETING: Hello, World!

tasks:
  greet:
    cmds:
      - echo "{{.GREETING}}"

变量的优先级调整为:

  1. Task 内变量
  2. 调用变量
  3. Taskfile 定义变量
  4. Taskvars 文件定义变量
  5. 系统环境变量

新增全局配置项,允许配置变量扩展范围(默认为 2):

version: "2"

expansions: 3

vars:
  FOO: foo
  BAR: bar
  BAZ: baz
  FOOBAR: "{{.FOO}}{{.BAR}}"
  FOOBARBAZ: "{{.FOOBAR}}{{.BAZ}}"

tasks:
  default:
    cmds:
      - echo "{{.FOOBARBAZ}}"

2.1 版本

2.1 版本包含了 output 选项, 控制命令如何输出到控制台(查看 文档 了解更多):

version: "2"

output: prefixed

tasks:
  server:
    cmds:
      - go run main.go
  prefix: server

从这个版本开始允许忽略命令或 task 的错误消息(查看文档):

version: "2"

tasks:
  example-1:
    cmds:
      - cmd: exit 1
        ignore_error: true
      - echo "This will be print"

  example-2:
    cmds:
      - exit 1
      - echo "This will be print"
    ignore_error: true

Version 2.2

2.2 版本在全局增加了 includes 选项,来引入其它 Taskfile 文件:

version: "2"

includes:
  docs: ./documentation # will look for ./documentation/Taskfile.yml
  docker: ./DockerTasks.yml

Version 2.6

2.6 版本增加任务的先决条件字段 preconditions

version: "2"

tasks:
  upload_environment:
    preconditions:
      - test -f .env
    cmds:
      - aws s3 cp .env s3://myenvironment

查看 文档

Version 3

版本 v3 的一些主要变化有:

  • Task 的日志使用彩色输出
  • 支持类 .env 文件
  • 新增 label: 设置后会覆盖输出日志中的任务名字
  • 新增 method: 设置全局默认方法, 未设置时 Task 的默认方法变更为 checksum
  • status: 中新增两个内置变量: CHECKSUMTIMESTAMP, 用来代表 sources: 中文件的 md5 值和最后变更时间
  • 同时,TASK 变量始终表示当前任务的名字
  • CLI 中的变量总是被当做全局变量
  • includes 中新增 dir:,允许选择引入文件的具体目录:
includes:
  docs:
    taskfile: ./docs
    dir: ./docs
  • 语法精简。下面所有的语法都是同义的:
version: "3"

tasks:
  print:
    cmds:
      - echo "Hello, World!"
version: "3"

tasks:
  print:
    - echo "Hello, World!"
version: "3"

tasks:
  print: echo "Hello, World!"
  • 另一个主要变化是在变量使用上。现在的方式更容易理解。expansions: 被移除。 下面是 Task 处理变量的顺序,每一层都可以使用上一层的变量,也可以覆盖上一层变量。
  • 环境变量
  • 全局或 CLI 变量
  • 调用变量
  • Task 内的变量