Idiomatic build tool in Go
Go Shell
Switch branches/tags
Nothing to show
Latest commit 104f801 Jan 12, 2014 @jingweno Add link to examples

README.md

gotask Build Status GoDoc

An idiomatic build tool in Go.

Motivation

To write build tasks on a Go project in Go instead of Make, Rake or insert your build tool here. I've written a longer preach on the motivation.

Overview

gotask is a simple build tool designed for Go. It provides a convention-over-configuration way of writing build tasks in Go. gotask is heavily inspired by go test.

Installation

$ go get -u github.com/jingweno/gotask

Defining a Task

Similar to defining a Go test, create a file called TASK_NAME_task.go and name the task function in the format of

// +build gotask

package main

import "github.com/jingweno/gotask/tasking"

// NAME
//    The name of the task - a one-line description of what it does
//
// DESCRIPTION
//    A textual description of the task function
//
// OPTIONS
//    Definition of what command line options it takes
func TaskXxx(t *tasking.T) {
  ...
}

where Xxx can be any alphanumeric string (but the first letter must not be in [a-z]) and serves to identify the task name. The task must be defined inside a GOPATH so that gotask can find and compile it.

Task Name

By default, gotask will dasherize the Xxx part of the task function name and use it as the task name, without you further declaring it in the comments.

Comments as Man Page™

It's a good practice to document tasks in a sensible way. In gotask, the comments for the task function are parsed as the task's man page by following the man page layout: Section NAME contains the name of the task and a one-line description of what it does, separated by a "-"; Section DESCRIPTION contains the textual description of the task function; Section OPTIONS contains the definition of the command line flags it takes.

Build Tags

The // +build gotask build tag constraints task functions to gotask build only. Without the build tag, task functions will be available to application build which may not be desired.

Compiling Tasks

gotask is able to compile defined tasks into an executable using go build. This is useful when you need to distribute your build executables. See gotask -c for details.

Task Scaffolding

gotask is able to generate a task scaffolding to quickly get you started for writing build tasks with the --generate or -g flag. The generated task is named as pkg_task.go where pkg is the name of the package that gotask is run:

// in a folder where package example is defined
$ gotask -g
create example_task.go

Multiple Tasks

You can define multiple task functions by following the TaskXxx convention in a task file. You can also create multiple task files by following the xxx_task.go convention. gotask is able to find all tasks in the same directory where it's run.

Examples

On a Go project, create a file called sayhello_task.go with the following content:

// +build gotask

package main

import (
	"github.com/jingweno/gotask/tasking"
	"os/user"
	"time"
)

// NAME
//    say-hello - Say hello to current user
//
// DESCRIPTION
//    Print out hello to current user
//
// OPTIONS
//    --verbose, -v
//        run in verbose mode
func TaskSayHello(t *tasking.T) {
	user, _ := user.Current()
	if t.Flags.Bool("v") || t.Flags.Bool("verbose") {
		t.Logf("Hello %s, the time now is %s\n", user.Name, time.Now())
	} else {
		t.Logf("Hello %s\n", user.Name)
	}
}

Make sure the build tag // +build gotask is the first line of the file and there's an empty line before package definition. The comments of the task should be in the format of the man page layout. Running gotask -h will display all the tasks:

$ gotask -h
NAME:
   gotask - Build tool in Go

USAGE:
   gotask [global options] command [command options] [arguments...]

VERSION:
   0.8.0

COMMANDS:
   say-hello    Say hello to current user
   help, h      Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --generate, -g       generate a task scaffold named pkg_task.go
   --compile, -c        compile the task binary to pkg.task but do not run it
   --debug              run in debug mode
   --version            print the version
   --help, -h           show help

Running gotask say-hello -h will display usage for a task. Noticing section NAME of the comments appears as the task name and usage for say-hello, section DESCRIPTION becomes the description, section OPTIONS becomes the options:

$ gotask say-hello -h
NAME:
   say-hello - Say hello to current user

USAGE:
   command say-hello [command options] [arguments...]

DESCRIPTION:
   Print out hello to current user

OPTIONS:
   --verbose, -v        run in verbose mode
   --debug              run in debug mode

To execute the task, type:

$ gotask say-hello
Hello Owen Ou

To execute the task in verbose mode, type:

$ gotask say-hello -v
Hello Owen Ou, the time now is 2013-11-20 15:32:00.73771438 -0800 PST

To compile the task into an executable named pkg.task where pkg is the last segment of the import path using go build, type:

$ gotask -c

Running the compiled tasks yields the same result:

$ ./examples.task say-hello
Hello Owen Ou

More examples are available.

License

gotask is released under the MIT license. See LICENSE.md.