diff --git a/README.md b/README.md index db63cf6a..dce10a8f 100644 --- a/README.md +++ b/README.md @@ -268,6 +268,37 @@ printos: - echo 'Is SH? {{IsSH}}' ``` +### Help + +Running `task help` lists all tasks with a description. The following taskfile: + +```yml +build: + desc: Build the go binary. + cmds: + - go build -v -i main.go + +test: + desc: Run all the go tests. + cmds: + - go test -race ./... + +js: + cmds: + - npm run buildjs + +css: + cmds: + - npm run buildcss +``` + +would print the following output: + +```bash +build Build the go binary. +test Run all the go tests. +``` + ## Alternatives Similar software: diff --git a/Taskfile.yml b/Taskfile.yml index 70c45244..816f138a 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -1,20 +1,24 @@ # compiles current source code and make "task" executable available on # $GOPATH/bin/task{.exe} install: + desc: Installs Task cmds: - go install -v ./... lint: + desc: Runs golint cmds: - golint . - golint ./cmd/task test: + desc: Runs test suite deps: [install] cmds: - go test -v # https://github.com/goreleaser/goreleaser release: + desc: Release Task cmds: - goreleaser diff --git a/help.go b/help.go new file mode 100644 index 00000000..3f085dbc --- /dev/null +++ b/help.go @@ -0,0 +1,33 @@ +package task + +import ( + "fmt" + "os" + "sort" + "text/tabwriter" +) + +func printExistingTasksHelp() { + tasks := tasksWithDesc() + if len(tasks) == 0 { + return + } + fmt.Println("Available tasks for this project:") + + // Format in tab-separated columns with a tab stop of 8. + w := tabwriter.NewWriter(os.Stdout, 0, 8, 0, '\t', 0) + for _, task := range tasks { + fmt.Fprintln(w, fmt.Sprintf("- %s:\t%s", task, Tasks[task].Desc)) + } + w.Flush() +} + +func tasksWithDesc() (tasks []string) { + for name, task := range Tasks { + if task.Desc != "" { + tasks = append(tasks, name) + } + } + sort.Strings(tasks) + return +} diff --git a/task.go b/task.go index f0df8923..984a5531 100644 --- a/task.go +++ b/task.go @@ -30,6 +30,7 @@ var ( type Task struct { Cmds []string Deps []string + Desc string Sources []string Generates []string Dir string @@ -54,6 +55,16 @@ func Run() { log.Fatal(err) } + // check if given tasks exist + for _, a := range args { + if _, ok := Tasks[a]; !ok { + var err error = &taskNotFoundError{taskName: a} + fmt.Println(err) + printExistingTasksHelp() + return + } + } + for _, a := range args { if err = RunTask(a); err != nil { log.Fatal(err)