matr command
$ go get github.com/euforic/matrExecute target func
$ matr [target]List available targets and matr flags
$ matr -h
Usage: matr <opts> [target] args...
Targets:
   build    Build will builds the project
   run      Run will run the project
   proto    Proto will build the protobuf files into golang files
   test     Test runs all go tests
   bench    Bench runs all the go benchmarks
   docker   Docker builds static go binary then builds a docker image for itGet expanded help for a target
$ matr -h [target]A matr file is any regular go file. Matrfiles must be marked with a build target of "matr"
and be a package main file. The default Matrfile is ./Matrfile.go or ./Matrfile to avoid
conflicts. A custom Matrfile path can be defined with the -matrfile flag (example: matr -matrfile /somepath/yourfile.go)
Example Matrfile header
//go:build matr
package mainAny exported function that is func(ctx context.Context, args []string) error is considered a
matr target. If the function returns an error it will print to stdout and cause the matrfile
to exit with an exit with a non 0 exit code.
Comments on the target function will become documentation accessible by running
matr (with no target). This will list all the build targets in this directory with the first
sentence from their docs.
A target may be designated the default target, which is run when the user runs
matr with no target specified. To denote the default, create a function named Default.
If no default target is specified, running matr with no target will print the list of targets
and docs.
The helper function matr.Deps(ctx, ...matr.HandlerFunc) may be passed a context and any number of
functions (they do not have to be exported), and the Deps function will not return until all
declared dependencies have been run (and any dependencies they have are run).
func Build(ctx context.Context, args []string) error {
    err := matr.Deps(ctx, F, G)
    fmt.Println("Build running")
    return err
}
func F(ctx context.Context, args []string) error {
    err := matr.Deps(ctx, h)
    fmt.Println("f running")
    return err
}
func G(ctx context.Context, args []string) error {
    err := matr.Deps(ctx, F)
    fmt.Println("g running")
    return err
}
func h(ctx context.Context, args []string) error {
    fmt.Println("h running")
    return err
}