goyek (/ˈɡɔɪæk/ 🔊 listen) is a task automation library intended to be an alternative to Make, Mage, Task.
The primary properties of goyek are:
- Library, not an application, with API inspired by
testing,cobra,flag,http. - Cross-platform and shell independent.
- No binary installation needed.
- Easy to debug, like regular Go code.
- Tasks are defined similarly to
cobracommands. - The task action looks like a Go test.
goyek.Ahas similar methods totesting.T. - Reuse any Go code and library e.g.
viper. - Highly customizable.
- Zero third-party dependencies.
- Additional features in
goyek/x.
5-minute video: Watch here (Slides).
Please ⭐ Star this repository if you find it valuable.
For build automation, store your code in the build directory.
The following example defines a simple hello task that logs a message
and prints the Go version.
Create build/hello.go:
package main
import (
"flag"
"github.com/goyek/goyek/v2"
"github.com/goyek/x/cmd"
)
var msg = flag.String("msg", "greeting message", "Hello world!")
var hello = goyek.Define(goyek.Task{
Name: "hello",
Usage: "demonstration",
Action: func(a *goyek.A) {
a.Log(*msg)
cmd.Exec(a, "go version")
},
})Create build/main.go:
package main
import (
"os"
"github.com/goyek/goyek/v2"
"github.com/goyek/x/boot"
)
func main() {
if err := os.Chdir(".."); err != nil {
panic(err)
}
goyek.SetDefault(hello)
boot.Main()
}The packages from github.com/goyek/x
are used for convenience.
Run help:
cd build
go mod tidy
go run . -hExpected output:
Usage of build: [flags] [--] [tasks]
Tasks:
hello demonstration
Flags:
-dry-run
print all tasks without executing actions
-long-run duration
print when a task takes longer (default 1m0s)
-msg string
Hello world! (default "greeting message")
-no-color
disable colorizing output
-no-deps
do not process dependencies
-skip comma-separated tasks
skip processing the comma-separated tasks
-v print all tasks as they are run
Run with verbose output:
go run . -vExample output:
===== TASK hello
hello.go:16: greeting message
hello.go:17: Exec: go version
go version go1.24.0 linux/amd64
----- PASS: hello (0.12s)
ok 0.123s
Instead of running go run . inside build, you can use wrapper scripts:
Use goyek/template when creating
a new repository. For existing repositories, simply copy the relevant files.
See the documentation for more information.
We welcome contributions! See CONTRIBUTING.md for details.
goyek is licensed under the terms of the MIT license.
Note: goyek was named taskflow before v0.3.0.