diff --git a/CHANGELOG.md b/CHANGELOG.md index 75883beb..60fff031 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,11 +9,21 @@ ## Unreleased +- Fixed panic bug when assigning a global variable + ([#229](https://github.com/go-task/task/issues/229), [#243](https://github.com/go-task/task/issues/234)). + +## v2.6.0 - 2019-07-21 + - Fixed some bugs regarding minor version checks on `version:`. - Add `preconditions:` to task ([#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)). +- It's now possible to install Task using Homebrew on Linux + ([go-task/homebrew-tap#1](https://github.com/go-task/homebrew-tap/pull/1)). ## v2.5.2 - 2019-05-11 diff --git a/cmd/task/task.go b/cmd/task/task.go index 72f73bd8..8091e363 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" @@ -18,7 +19,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. @@ -59,6 +60,7 @@ func main() { dry bool summary bool dir string + entrypoint string output string color bool ) @@ -74,6 +76,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.BoolVarP(&color, "color", "c", true, "colored output") pflag.Parse() @@ -94,15 +97,27 @@ 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, - Color: color, + Force: force, + Watch: watch, + Verbose: verbose, + Silent: silent, + Dir: dir, + Dry: dry, + Entrypoint: entrypoint, + Summary: summary, + Color: color, Stdin: os.Stdin, Stdout: os.Stdout, diff --git a/docs/installation.md b/docs/installation.md index f40609a0..364f81b8 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -8,13 +8,15 @@ The `task_checksums.txt` file contains the sha256 checksum for each file. ## Homebrew -If you're on macOS and have [Homebrew][homebrew] installed, getting Task is -as simple as running: +If you're on macOS or Linux and have [Homebrew][homebrew] installed, getting +Task is as simple as running: ```bash brew install go-task/tap/go-task ``` +> This installation method is only currently supported on amd64 architectures. + ## Snap Task is available for [Snapcraft][snapcraft], but keep in mind that your diff --git a/docs/usage.md b/docs/usage.md index 7890a8b0..7b9f5fd0 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -148,6 +148,8 @@ tasks: - caddy ``` +If the directory doesn't exist, `task` creates it. + ## Task dependencies You may have tasks that depend on others. Just pointing them on `deps` will @@ -398,7 +400,7 @@ tasks: When doing interpolation of variables, Task will look for the below. They are listed below in order of importance (e.g. most important first): -- Variables declared locally in the task +- Variables declared in the task definition - Variables given while calling a task from another. (See [Calling another task](#calling-another-task) above) - Variables declared in the `vars:` option in the `Taskfile` 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/internal/taskfile/taskfile.go b/internal/taskfile/taskfile.go index b3869fbd..6da09dd0 100644 --- a/internal/taskfile/taskfile.go +++ b/internal/taskfile/taskfile.go @@ -40,5 +40,8 @@ func (tf *Taskfile) UnmarshalYAML(unmarshal func(interface{}) error) error { if tf.Expansions <= 0 { tf.Expansions = 2 } + if tf.Vars == nil { + tf.Vars = make(Vars) + } return nil } diff --git a/task.go b/task.go index 72e3e0b5..40b1dc98 100644 --- a/task.go +++ b/task.go @@ -32,14 +32,16 @@ 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 - Color bool + + Dir string + Entrypoint string + Force bool + Watch bool + Verbose bool + Silent bool + Dry bool + Summary bool + Color bool Stdin io.Reader Stdout io.Writer @@ -86,8 +88,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 }