diff --git a/docs/docs/usage.md b/docs/docs/usage.md index cf8cb1f6f9..a54f282c13 100644 --- a/docs/docs/usage.md +++ b/docs/docs/usage.md @@ -119,6 +119,10 @@ tasks: ### Task +:::info +Custom environment variables will **overwrite** any predefined environment variables from your shell. +:::info + You can use `env` to set custom environment variables for a specific task: ```yaml diff --git a/internal/env/env.go b/internal/env/env.go index b18279c599..153b0f0517 100644 --- a/internal/env/env.go +++ b/internal/env/env.go @@ -20,10 +20,6 @@ func Get(t *taskfile.Task) []string { continue } - if _, alreadySet := os.LookupEnv(k); alreadySet { - continue - } - environ = append(environ, fmt.Sprintf("%s=%s", k, str)) } diff --git a/task_test.go b/task_test.go index beebdc5b4d..f2391a7ec9 100644 --- a/task_test.go +++ b/task_test.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "os" + "os/exec" "path/filepath" "runtime" "strings" @@ -13,6 +14,7 @@ import ( "github.com/Masterminds/semver/v3" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/go-task/task/v3" "github.com/go-task/task/v3/internal/filepathext" @@ -1832,3 +1834,29 @@ func TestBashShellOptsCommandLevel(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "globstar\ton\n", buff.String()) } + +func TestOverwriteEnvironment(t *testing.T) { + binary := buildTask(t) + + cmd := exec.Command(binary) + cmd.Dir = "testdata/env_override" + cmd.Env = []string{"PREDEFINED=initial"} + require.NoError(t, cmd.Run()) + + output, err := os.ReadFile("testdata/env_override/output.txt") + require.NoError(t, err) + require.Equal(t, "PREDEFINED='overwritten'", string(output)) +} + +func buildTask(t *testing.T) string { + temp := t.TempDir() + + binary := filepath.Join(temp, "task") + command := exec.Command("go", "build", "-o", binary, "cmd/task/task.go") + var output bytes.Buffer + command.Stdout = &output + command.Stderr = &output + require.NoError(t, command.Run(), &output) + + return binary +} diff --git a/testdata/env_override/.gitignore b/testdata/env_override/.gitignore new file mode 100644 index 0000000000..2211df63dd --- /dev/null +++ b/testdata/env_override/.gitignore @@ -0,0 +1 @@ +*.txt diff --git a/testdata/env_override/Taskfile.yaml b/testdata/env_override/Taskfile.yaml new file mode 100644 index 0000000000..b50275772a --- /dev/null +++ b/testdata/env_override/Taskfile.yaml @@ -0,0 +1,10 @@ +version: '3' + +silent: true + +tasks: + default: + env: + PREDEFINED: 'overwritten' + cmds: + - echo -n "PREDEFINED='$PREDEFINED'" > output.txt