markbates / grift

Go based task runner
MIT License
432 stars 24 forks source link

Grift

Grift is a very simple library that allows you to write simple "task" scripts in Go and run them by name without having to write big main type of wrappers. Grift is similar to, and inspired by, Rake.

Why?

Excellent question! When building applications there comes a point where you need different scripts to do different things. For example, you might want a script to seed your database, or perhaps a script to parse some logs, etc...

Grift lets you write these scripts using Go in a really simple and extensible way.

Installation

Installation is really easy using go get.

$ go get github.com/markbates/grift

You can confirm the installation by running:

$ grift jim

Usage/Getting Started

Apart from having the binary installed, the only other requirement is that the package you place your grifts in is called grifts. That's it.

By running the following command:

$ grift init

When you run the init sub-command Grift will generate a new grifts package and create a couple of simple grifts for you.

List available grifts

$ grift list

Say Hello!

$ grift hello

That's it!

That's really it! Grift is meant to be simple. Write your grifts, use the full power of Go to do it.

For more information I would highly recommend checking out the docs.

Examples:

package grifts

import (
    "errors"
    "fmt"
    "os"
    "strings"

    . "github.com/markbates/grift/grift"
)

var _ = Add("boom", func(c *Context) error {
    return errors.New("boom!!!")
})

var _ = Add("hello", func(c *Context) error {
    fmt.Println("Hello World!")
    return nil
})

var _ = Add("hello", func(c *Context) error {
    fmt.Println("Hello World! Again")
    err := Run("db:migrate", c)
    if err != nil {
        return err
    }
    dir, err := os.Getwd()
    if err != nil {
        return err
    }
    fmt.Printf("### dir -> %+v\n", dir)
    return nil
})

var _ = Add("env:print", func(c *Context) error {
    if len(c.Args) >= 1 {
        for _, e := range c.Args {
            fmt.Printf("%s=%s\n", e, os.Getenv(e))
        }
    } else {
        for _, e := range os.Environ() {
            pair := strings.Split(e, "=")
            fmt.Printf("%s=%s\n", pair[0], os.Getenv(pair[0]))
        }
    }

    return nil
})

var _ = Namespace("db", func() {
    Desc("migrate", "Migrates the databases")
    Set("migrate", func(c *Context) error {
            fmt.Println("db:migrate")
            fmt.Printf("### args -> %+v\n", c.Args)
            return nil
    })
}