Task runner with YAML config written in Go

ruanbekker

Ruan Bekker

Posted on August 7, 2021

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.

💖 💪 🙅 🚩
ruanbekker
Ruan Bekker

Posted on August 7, 2021

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related