DEV Community

Cover image for Task runner with YAML config written in Go
Ruan Bekker
Ruan Bekker

Posted on

Task runner with YAML config written in Go

Task (aka Taskfile) is a task runner written in Go, which is similar to GNU Make, but in my opinion is a lot easier to use as you specify your tasks in yaml.

Originally posted on blog.ruanbekker.com

What to expect

In this post we will go through a quick demonstration using Task, how to install Task, as well as a couple of basic examples to get you up and running with Task.

Install

For mac, installing task::

$ brew install go-task/tap/go-task
Enter fullscreen mode Exit fullscreen mode

For linux, installing task:

$ sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /usr/local/bin
Enter fullscreen mode Exit fullscreen mode

Or manual installation for arm as an example:

$ pushd /tmp
$ wget https://github.com/go-task/task/releases/download/v3.7.0/task_linux_arm.tar.gz
$ tar -xvf task_linux_arm.tar.gz
$ sudo mv task /usr/local/bin/task
$ sudo chmod +x /usr/local/bin/task
$ popd
Enter fullscreen mode Exit fullscreen mode

Verify that task is installed:

$ task --version
Task version: v3.7.0
Enter fullscreen mode Exit fullscreen mode

For more information check the installation page:

Usage

Task uses a default config file: Taskfile.yml in the current working directory where you can provide context on what your tasks should do.

For a basic hello-world example, this task helloworld will echo out hello, world!:

version: '3'

tasks:
  helloworld:
    cmds:
      - echo "hello, world!"
Enter fullscreen mode Exit fullscreen mode

Which we call using the application task with the argument of the task name:

$ task helloworld
task: [helloworld] echo "hello, world!"
hello, world!
Enter fullscreen mode Exit fullscreen mode

For a example using environment variables, we can use it in two ways:

  • per task
  • globally, across all tasks

For using environment variables per task:

version: '3'

tasks:
  helloworld:
    cmds:
      - echo "hello, $WORD!"
    env:
      WORD: world
Enter fullscreen mode Exit fullscreen mode

Results in:

$ task helloworld
task: [helloworld] echo "hello, $WORD!"
hello, world!
Enter fullscreen mode Exit fullscreen mode

For using environment variables globally across all tasks:

version: '3'

env:
  WORD: world

tasks:
  helloworld:
    cmds:
      - echo "hello, $WORD!"
    env:
      GREETING: hello

  byeworld:
    cmds:
      - echo "$GREETING, $WORD!"
    env:
      GREETING: bye
Enter fullscreen mode Exit fullscreen mode

Running our first task:

$ task helloworld
task: [helloworld] echo "hello, $WORD!"
hello, world!
Enter fullscreen mode Exit fullscreen mode

And running our second task:

$ task byeworld
task: [byeworld] echo "$GREETING, $WORD!"
bye, world!
Enter fullscreen mode Exit fullscreen mode

To store your environment variables in a .env file, you can specify it as the following in your Taskfile.yml:

version: '3'

dotenv: ['.env']

tasks:
  helloworld:
    cmds:
      - echo "hello, $WORD!"
    env:
      GREETING: hello

  byeworld:
    cmds:
      - echo "$GREETING, $WORD!"
    env:
      GREETING: bye
Enter fullscreen mode Exit fullscreen mode

And in your .env:

WORD=world
Enter fullscreen mode Exit fullscreen mode

Then you should see your environment variables referenced from the .env file:

$ task helloworld
task: [helloworld] echo "hello, $WORD!"
hello, world!
Enter fullscreen mode Exit fullscreen mode

To run both tasks with one command, you can specify dependencies, so if we define a task with zero commands but just dependencies, it will call those tasks and execute them:

version: '3'

env:
  WORD: world

tasks:
  helloworld:
    cmds:
      - echo "hello, $WORD!"
    env:
      GREETING: hello

  byeworld:
    cmds:
      - echo "$GREETING, $WORD!"
    env:
      GREETING: bye

  all:
    deps: [helloworld, byeworld]
Enter fullscreen mode Exit fullscreen mode

So when we run the all task:

$ task all
task: [helloworld] echo "hello, $WORD!"
hello, world!
task: [byeworld] echo "$GREETING, $WORD!"
bye, world!
Enter fullscreen mode Exit fullscreen mode

For more usage examples, have a look at their documentation:

Thanks

Thanks for reading, if you like my content, check out my website or follow me at @ruanbekker on Twitter.

Discussion (0)