diff --git a/CHANGELOG.md b/CHANGELOG.md index c7d83880..adaaeee6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ ([#205](https://github.com/go-task/task/pull/205)). - Create directory informed on `dir:` if it doesn't exist ([#209](https://github.com/go-task/task/issues/209), [#211](https://github.com/go-task/task/pull/211)). +- We now have a `--taskfile` flag (alias `-t`), which can be used to run + another Taskfile (other than the default `Taskfile.yml`) + ([#221](https://github.com/go-task/task/pull/221)). ## v2.5.2 - 2019-05-11 diff --git a/cmd/task/task.go b/cmd/task/task.go index 4070e1b9..b71023ac 100644 --- a/cmd/task/task.go +++ b/cmd/task/task.go @@ -5,6 +5,7 @@ import ( "log" "os" "os/signal" + "path/filepath" "syscall" "github.com/go-task/task/v2" @@ -17,7 +18,7 @@ var ( version = "master" ) -const usage = `Usage: task [-ilfwvsd] [--init] [--list] [--force] [--watch] [--verbose] [--silent] [--dir] [--dry] [--summary] [task...] +const usage = `Usage: task [-ilfwvsd] [--init] [--list] [--force] [--watch] [--verbose] [--silent] [--dir] [--taskfile] [--dry] [--summary] [task...] Runs the specified task(s). Falls back to the "default" task if no task name was specified, or lists all tasks if an unknown task name was specified. @@ -58,6 +59,7 @@ func main() { dry bool summary bool dir string + entrypoint string output string ) @@ -72,6 +74,7 @@ func main() { pflag.BoolVar(&dry, "dry", false, "compiles and prints tasks in the order that they would be run, without executing them") pflag.BoolVar(&summary, "summary", false, "show summary about a task") pflag.StringVarP(&dir, "dir", "d", "", "sets directory of execution") + pflag.StringVarP(&entrypoint, "taskfile", "t", "", `choose which Taskfile to run. Defaults to "Taskfile.yml"`) pflag.StringVarP(&output, "output", "o", "", "sets output style: [interleaved|group|prefixed]") pflag.Parse() @@ -91,14 +94,26 @@ func main() { return } + if dir != "" && entrypoint != "" { + log.Fatal("task: You can't set both --dir and --taskfile") + return + } + if entrypoint != "" { + dir = filepath.Dir(entrypoint) + entrypoint = filepath.Base(entrypoint) + } else { + entrypoint = "Taskfile.yml" + } + e := task.Executor{ - Force: force, - Watch: watch, - Verbose: verbose, - Silent: silent, - Dir: dir, - Dry: dry, - Summary: summary, + Force: force, + Watch: watch, + Verbose: verbose, + Silent: silent, + Dir: dir, + Dry: dry, + Entrypoint: entrypoint, + Summary: summary, Stdin: os.Stdin, Stdout: os.Stdout, diff --git a/internal/taskfile/read/taskfile.go b/internal/taskfile/read/taskfile.go index b3911e4e..a08360d3 100644 --- a/internal/taskfile/read/taskfile.go +++ b/internal/taskfile/read/taskfile.go @@ -15,16 +15,13 @@ import ( var ( // ErrIncludedTaskfilesCantHaveIncludes is returned when a included Taskfile contains includes ErrIncludedTaskfilesCantHaveIncludes = errors.New("task: Included Taskfiles can't have includes. Please, move the include to the main Taskfile") - - // ErrNoTaskfileFound is returned when Taskfile.yml is not found - ErrNoTaskfileFound = errors.New(`task: No Taskfile.yml found. Use "task --init" to create a new one`) ) // Taskfile reads a Taskfile for a given directory -func Taskfile(dir string) (*taskfile.Taskfile, error) { - path := filepath.Join(dir, "Taskfile.yml") +func Taskfile(dir string, entrypoint string) (*taskfile.Taskfile, error) { + path := filepath.Join(dir, entrypoint) if _, err := os.Stat(path); err != nil { - return nil, ErrNoTaskfileFound + return nil, fmt.Errorf(`task: No Taskfile found on "%s". Use "task --init" to create a new one`, path) } t, err := readTaskfile(path) if err != nil { diff --git a/task.go b/task.go index 1332c46c..83198192 100644 --- a/task.go +++ b/task.go @@ -32,13 +32,15 @@ const ( // Executor executes a Taskfile type Executor struct { Taskfile *taskfile.Taskfile - Dir string - Force bool - Watch bool - Verbose bool - Silent bool - Dry bool - Summary bool + + Dir string + Entrypoint string + Force bool + Watch bool + Verbose bool + Silent bool + Dry bool + Summary bool Stdin io.Reader Stdout io.Writer @@ -85,8 +87,12 @@ func (e *Executor) Run(ctx context.Context, calls ...taskfile.Call) error { // Setup setups Executor's internal state func (e *Executor) Setup() error { + if e.Entrypoint == "" { + e.Entrypoint = "Taskfile.yml" + } + var err error - e.Taskfile, err = read.Taskfile(e.Dir) + e.Taskfile, err = read.Taskfile(e.Dir, e.Entrypoint) if err != nil { return err }