mirror of
https://github.com/go-task/task.git
synced 2025-02-03 13:22:11 +02:00
Allow override the .task
dir location with the TASK_TEMP_DIR
env
This commit is contained in:
parent
f54fef7e7b
commit
fedb68cde7
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
- Add ability to override the `.task` directory location with the
|
||||||
|
`TASK_TEMP_DIR` environment variable.
|
||||||
- Allow to override Task colors using environment variables:
|
- Allow to override Task colors using environment variables:
|
||||||
`TASK_COLOR_RESET`, `TASK_COLOR_BLUE`, `TASK_COLOR_GREEN`,
|
`TASK_COLOR_RESET`, `TASK_COLOR_BLUE`, `TASK_COLOR_GREEN`,
|
||||||
`TASK_COLOR_CYAN`, `TASK_COLOR_YELLOW`, `TASK_COLOR_MAGENTA`
|
`TASK_COLOR_CYAN`, `TASK_COLOR_YELLOW`, `TASK_COLOR_MAGENTA`
|
||||||
|
@ -406,8 +406,6 @@ tasks:
|
|||||||
Task will compare the checksum of the source files to determine if it's
|
Task will compare the checksum of the source files to determine if it's
|
||||||
necessary to run the task. If not, it will just print a message like
|
necessary to run the task. If not, it will just print a message like
|
||||||
`Task "js" is up to date`.
|
`Task "js" is up to date`.
|
||||||
You will probably want to ignore the `.task` folder in your `.gitignore` file
|
|
||||||
(It is there that Task stores the last checksum).
|
|
||||||
|
|
||||||
If you prefer this check to be made by the modification timestamp of the files,
|
If you prefer this check to be made by the modification timestamp of the files,
|
||||||
instead of its checksum (content), just set the `method` property to `timestamp`.
|
instead of its checksum (content), just set the `method` property to `timestamp`.
|
||||||
@ -428,6 +426,26 @@ tasks:
|
|||||||
|
|
||||||
:::info
|
:::info
|
||||||
|
|
||||||
|
By default, task stores checksums on a local `.task` directory in the project's
|
||||||
|
directory. Most of the time, you'll want to have this directory on `.gitignore`
|
||||||
|
(or equivalent) so it isn't committed. (If you have a task for code generation
|
||||||
|
that is committed it may make sense to commit the checksum of that task as
|
||||||
|
well, though).
|
||||||
|
|
||||||
|
If you want these files to be stored in another directory, you can set a
|
||||||
|
`TASK_TEMP_DIR` environment variable in your machine. It can contain a relative
|
||||||
|
path like `tmp/task` that will be interpreted as relative to the project
|
||||||
|
directory, or an absolute or home path like `/tmp/.task` or `~/.task`
|
||||||
|
(subdirectories will be created for each project).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export TASK_TEMP_DIR='~/.task'
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::info
|
||||||
|
|
||||||
Each task has only one checksum stored for its `sources`. If you want
|
Each task has only one checksum stored for its `sources`. If you want
|
||||||
to distinguish a task by any of its input variables, you can add those
|
to distinguish a task by any of its input variables, you can add those
|
||||||
variables as part of the task's label, and it will be considered a different
|
variables as part of the task's label, and it will be considered a different
|
||||||
|
@ -13,7 +13,7 @@ import (
|
|||||||
// Checksum validades if a task is up to date by calculating its source
|
// Checksum validades if a task is up to date by calculating its source
|
||||||
// files checksum
|
// files checksum
|
||||||
type Checksum struct {
|
type Checksum struct {
|
||||||
BaseDir string
|
TempDir string
|
||||||
TaskDir string
|
TaskDir string
|
||||||
Task string
|
Task string
|
||||||
Sources []string
|
Sources []string
|
||||||
@ -43,7 +43,7 @@ func (c *Checksum) IsUpToDate() (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !c.Dry {
|
if !c.Dry {
|
||||||
_ = os.MkdirAll(filepath.Join(c.BaseDir, ".task", "checksum"), 0755)
|
_ = os.MkdirAll(filepath.Join(c.TempDir, "checksum"), 0755)
|
||||||
if err = os.WriteFile(checksumFile, []byte(newMd5+"\n"), 0644); err != nil {
|
if err = os.WriteFile(checksumFile, []byte(newMd5+"\n"), 0644); err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
@ -107,7 +107,7 @@ func (*Checksum) Kind() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Checksum) checksumFilePath() string {
|
func (c *Checksum) checksumFilePath() string {
|
||||||
return filepath.Join(c.BaseDir, ".task", "checksum", c.normalizeFilename(c.Task))
|
return filepath.Join(c.TempDir, "checksum", c.normalizeFilename(c.Task))
|
||||||
}
|
}
|
||||||
|
|
||||||
var checksumFilenameRegexp = regexp.MustCompile("[^A-z0-9]")
|
var checksumFilenameRegexp = regexp.MustCompile("[^A-z0-9]")
|
||||||
|
@ -95,7 +95,7 @@ func (e *Executor) timestampChecker(t *taskfile.Task) status.Checker {
|
|||||||
|
|
||||||
func (e *Executor) checksumChecker(t *taskfile.Task) status.Checker {
|
func (e *Executor) checksumChecker(t *taskfile.Task) status.Checker {
|
||||||
return &status.Checksum{
|
return &status.Checksum{
|
||||||
BaseDir: e.Dir,
|
TempDir: e.TempDir,
|
||||||
TaskDir: t.Dir,
|
TaskDir: t.Dir,
|
||||||
Task: t.Name(),
|
Task: t.Name(),
|
||||||
Sources: t.Sources,
|
Sources: t.Sources,
|
||||||
|
19
task.go
19
task.go
@ -6,6 +6,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
@ -34,6 +36,7 @@ type Executor struct {
|
|||||||
Taskfile *taskfile.Taskfile
|
Taskfile *taskfile.Taskfile
|
||||||
|
|
||||||
Dir string
|
Dir string
|
||||||
|
TempDir string
|
||||||
Entrypoint string
|
Entrypoint string
|
||||||
Force bool
|
Force bool
|
||||||
Watch bool
|
Watch bool
|
||||||
@ -151,6 +154,22 @@ func (e *Executor) Setup() error {
|
|||||||
Color: e.Color,
|
Color: e.Color,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if e.TempDir == "" {
|
||||||
|
if os.Getenv("TASK_TEMP_DIR") == "" {
|
||||||
|
e.TempDir = filepath.Join(e.Dir, ".task")
|
||||||
|
} else if filepath.IsAbs(os.Getenv("TASK_TEMP_DIR")) || strings.HasPrefix(os.Getenv("TASK_TEMP_DIR"), "~") {
|
||||||
|
tempDir, err := execext.Expand(os.Getenv("TASK_TEMP_DIR"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
projectDir, _ := filepath.Abs(e.Dir)
|
||||||
|
projectName := filepath.Base(projectDir)
|
||||||
|
e.TempDir = filepath.Join(tempDir, projectName)
|
||||||
|
} else {
|
||||||
|
e.TempDir = filepath.Join(e.Dir, os.Getenv("TASK_TEMP_DIR"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if v < 2 {
|
if v < 2 {
|
||||||
return fmt.Errorf(`task: Taskfile versions prior to v2 are not supported anymore`)
|
return fmt.Errorf(`task: Taskfile versions prior to v2 are not supported anymore`)
|
||||||
}
|
}
|
||||||
|
27
task_test.go
27
task_test.go
@ -42,6 +42,7 @@ func (fct fileContentTest) Run(t *testing.T) {
|
|||||||
|
|
||||||
e := &task.Executor{
|
e := &task.Executor{
|
||||||
Dir: fct.Dir,
|
Dir: fct.Dir,
|
||||||
|
TempDir: filepath.Join(fct.Dir, ".task"),
|
||||||
Entrypoint: fct.Entrypoint,
|
Entrypoint: fct.Entrypoint,
|
||||||
Stdout: io.Discard,
|
Stdout: io.Discard,
|
||||||
Stderr: io.Discard,
|
Stderr: io.Discard,
|
||||||
@ -270,10 +271,11 @@ func TestStatus(t *testing.T) {
|
|||||||
|
|
||||||
var buff bytes.Buffer
|
var buff bytes.Buffer
|
||||||
e := &task.Executor{
|
e := &task.Executor{
|
||||||
Dir: dir,
|
Dir: dir,
|
||||||
Stdout: &buff,
|
TempDir: filepath.Join(dir, ".task"),
|
||||||
Stderr: &buff,
|
Stdout: &buff,
|
||||||
Silent: true,
|
Stderr: &buff,
|
||||||
|
Silent: true,
|
||||||
}
|
}
|
||||||
assert.NoError(t, e.Setup())
|
assert.NoError(t, e.Setup())
|
||||||
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-foo"}))
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-foo"}))
|
||||||
@ -421,9 +423,10 @@ func TestStatusChecksum(t *testing.T) {
|
|||||||
|
|
||||||
var buff bytes.Buffer
|
var buff bytes.Buffer
|
||||||
e := task.Executor{
|
e := task.Executor{
|
||||||
Dir: dir,
|
Dir: dir,
|
||||||
Stdout: &buff,
|
TempDir: filepath.Join(dir, ".task"),
|
||||||
Stderr: &buff,
|
Stdout: &buff,
|
||||||
|
Stderr: &buff,
|
||||||
}
|
}
|
||||||
assert.NoError(t, e.Setup())
|
assert.NoError(t, e.Setup())
|
||||||
|
|
||||||
@ -579,6 +582,7 @@ func TestStatusVariables(t *testing.T) {
|
|||||||
var buff bytes.Buffer
|
var buff bytes.Buffer
|
||||||
e := task.Executor{
|
e := task.Executor{
|
||||||
Dir: dir,
|
Dir: dir,
|
||||||
|
TempDir: filepath.Join(dir, ".task"),
|
||||||
Stdout: &buff,
|
Stdout: &buff,
|
||||||
Stderr: &buff,
|
Stderr: &buff,
|
||||||
Silent: false,
|
Silent: false,
|
||||||
@ -718,10 +722,11 @@ func TestDryChecksum(t *testing.T) {
|
|||||||
_ = os.Remove(checksumFile)
|
_ = os.Remove(checksumFile)
|
||||||
|
|
||||||
e := task.Executor{
|
e := task.Executor{
|
||||||
Dir: dir,
|
Dir: dir,
|
||||||
Stdout: io.Discard,
|
TempDir: filepath.Join(dir, ".task"),
|
||||||
Stderr: io.Discard,
|
Stdout: io.Discard,
|
||||||
Dry: true,
|
Stderr: io.Discard,
|
||||||
|
Dry: true,
|
||||||
}
|
}
|
||||||
assert.NoError(t, e.Setup())
|
assert.NoError(t, e.Setup())
|
||||||
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "default"}))
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "default"}))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user