1
0
mirror of https://github.com/go-task/task.git synced 2025-07-13 01:30:33 +02:00

Merge pull request #13 from go-task/feature/os-specific

Feature/os specific
This commit is contained in:
Sascha Andres
2017-03-07 16:01:19 +01:00
committed by GitHub
4 changed files with 90 additions and 20 deletions

View File

@ -42,8 +42,8 @@ task assets build
If Bash is available (Linux and Windows while on Git Bash), the commands will If Bash is available (Linux and Windows while on Git Bash), the commands will
run in Bash, otherwise will fallback to `cmd` (on Windows). run in Bash, otherwise will fallback to `cmd` (on Windows).
### Environment
### Environment
You can specify environment variables that are added when running a command: You can specify environment variables that are added when running a command:
```yml ```yml
@ -54,6 +54,30 @@ build:
hallo: welt hallo: welt
``` ```
### OS specific task support
If you add a `Taskfile_{{GOOS}}` you can override or amend your taskfile based on the op;erating system.
Example:
Taskfile.yml:
```yml
build:
cmds:
- echo "default"
```
Taskfile_linux.yml:
```yml
build:
cmds:
- echo "linux"
```
Will print out `linux` and not default
### Running task in another dir ### Running task in another dir
By default, tasks will be executed in the directory where the Taskfile is By default, tasks will be executed in the directory where the Taskfile is

View File

@ -4,8 +4,13 @@ import (
"fmt" "fmt"
) )
// ErrNoTaskFile is returned when the program can not find a proper TaskFile type taskFileNotFound struct {
var ErrNoTaskFile = fmt.Errorf(`task: No task file found (is it named "%s"?)`, TaskFilePath) taskFile string
}
func (err taskFileNotFound) Error() string {
return fmt.Sprintf(`task: No task file found (is it named "%s"?)`, err.taskFile)
}
type taskNotFoundError struct { type taskNotFoundError struct {
taskName string taskName string

58
read_taskfile.go Normal file
View File

@ -0,0 +1,58 @@
package task
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"runtime"
"github.com/BurntSushi/toml"
"github.com/imdario/mergo"
"gopkg.in/yaml.v2"
)
func readTaskfile() (map[string]*Task, error) {
initialTasks, err := readTaskfileData(TaskFilePath)
if err != nil {
return nil, err
}
mergeTasks, err := readTaskfileData(fmt.Sprintf("%s_%s", TaskFilePath, runtime.GOOS))
if err != nil {
switch err.(type) {
default:
return nil, err
case taskFileNotFound:
return initialTasks, nil
}
}
if err := mergo.MapWithOverwrite(&initialTasks, mergeTasks); err != nil {
return nil, err
}
return initialTasks, nil
}
func readTaskfileData(path string) (tasks map[string]*Task, err error) {
if b, err := ioutil.ReadFile(path + ".yml"); err == nil {
return tasks, yaml.Unmarshal(b, &tasks)
}
if b, err := ioutil.ReadFile(path + ".json"); err == nil {
return tasks, json.Unmarshal(b, &tasks)
}
if b, err := ioutil.ReadFile(path + ".toml"); err == nil {
return tasks, toml.Unmarshal(b, &tasks)
}
return nil, taskFileNotFound{path}
}
func exists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return true, err
}

17
task.go
View File

@ -1,17 +1,13 @@
package task package task
import ( import (
"encoding/json"
"fmt" "fmt"
"io/ioutil"
"log" "log"
"os" "os"
"os/exec" "os/exec"
"strings" "strings"
"github.com/BurntSushi/toml"
"github.com/spf13/pflag" "github.com/spf13/pflag"
"gopkg.in/yaml.v2"
) )
var ( var (
@ -185,16 +181,3 @@ func (t *Task) runCommand(i int, envVariables map[string]string) error {
} }
return nil return nil
} }
func readTaskfile() (tasks map[string]*Task, err error) {
if b, err := ioutil.ReadFile(TaskFilePath + ".yml"); err == nil {
return tasks, yaml.Unmarshal(b, &tasks)
}
if b, err := ioutil.ReadFile(TaskFilePath + ".json"); err == nil {
return tasks, json.Unmarshal(b, &tasks)
}
if b, err := ioutil.ReadFile(TaskFilePath + ".toml"); err == nil {
return tasks, toml.Unmarshal(b, &tasks)
}
return nil, ErrNoTaskFile
}