feat(taskrc): add remote.cache-dir configuration option

This commit is contained in:
Valentin Maerten
2025-12-12 22:58:44 +01:00
parent 5a27d04655
commit 20ac7ad3f7
5 changed files with 40 additions and 6 deletions

View File

@@ -37,6 +37,7 @@ type (
TrustedHosts []string TrustedHosts []string
Timeout time.Duration Timeout time.Duration
CacheExpiryDuration time.Duration CacheExpiryDuration time.Duration
RemoteCacheDir string
Watch bool Watch bool
Verbose bool Verbose bool
Silent bool Silent bool
@@ -271,6 +272,19 @@ func (o *cacheExpiryDurationOption) ApplyToExecutor(r *Executor) {
r.CacheExpiryDuration = o.duration r.CacheExpiryDuration = o.duration
} }
// WithRemoteCacheDir sets the directory where remote taskfiles are cached.
func WithRemoteCacheDir(dir string) ExecutorOption {
return &remoteCacheDirOption{dir: dir}
}
type remoteCacheDirOption struct {
dir string
}
func (o *remoteCacheDirOption) ApplyToExecutor(e *Executor) {
e.RemoteCacheDir = o.dir
}
// WithWatch tells the [Executor] to keep running in the background and watch // WithWatch tells the [Executor] to keep running in the background and watch
// for changes to the fingerprint of the tasks that are run. When changes are // for changes to the fingerprint of the tasks that are run. When changes are
// detected, a new task run is triggered. // detected, a new task run is triggered.

View File

@@ -12,6 +12,7 @@ import (
"github.com/go-task/task/v3" "github.com/go-task/task/v3"
"github.com/go-task/task/v3/errors" "github.com/go-task/task/v3/errors"
"github.com/go-task/task/v3/experiments" "github.com/go-task/task/v3/experiments"
"github.com/go-task/task/v3/internal/env"
"github.com/go-task/task/v3/internal/sort" "github.com/go-task/task/v3/internal/sort"
"github.com/go-task/task/v3/taskfile/ast" "github.com/go-task/task/v3/taskfile/ast"
"github.com/go-task/task/v3/taskrc" "github.com/go-task/task/v3/taskrc"
@@ -79,6 +80,7 @@ var (
ClearCache bool ClearCache bool
Timeout time.Duration Timeout time.Duration
CacheExpiryDuration time.Duration CacheExpiryDuration time.Duration
RemoteCacheDir string
) )
func init() { func init() {
@@ -161,6 +163,7 @@ func init() {
pflag.DurationVar(&Timeout, "timeout", getConfig(config, func() *time.Duration { return config.Remote.Timeout }, time.Second*10), "Timeout for downloading remote Taskfiles.") pflag.DurationVar(&Timeout, "timeout", getConfig(config, func() *time.Duration { return config.Remote.Timeout }, time.Second*10), "Timeout for downloading remote Taskfiles.")
pflag.BoolVar(&ClearCache, "clear-cache", false, "Clear the remote cache.") pflag.BoolVar(&ClearCache, "clear-cache", false, "Clear the remote cache.")
pflag.DurationVar(&CacheExpiryDuration, "expiry", getConfig(config, func() *time.Duration { return config.Remote.CacheExpiry }, 0), "Expiry duration for cached remote Taskfiles.") pflag.DurationVar(&CacheExpiryDuration, "expiry", getConfig(config, func() *time.Duration { return config.Remote.CacheExpiry }, 0), "Expiry duration for cached remote Taskfiles.")
RemoteCacheDir = getConfig(config, func() *string { return config.Remote.CacheDir }, env.GetTaskEnv("REMOTE_DIR"))
} }
pflag.Parse() pflag.Parse()
} }
@@ -247,6 +250,7 @@ func (o *flagsOption) ApplyToExecutor(e *task.Executor) {
task.WithTrustedHosts(TrustedHosts), task.WithTrustedHosts(TrustedHosts),
task.WithTimeout(Timeout), task.WithTimeout(Timeout),
task.WithCacheExpiryDuration(CacheExpiryDuration), task.WithCacheExpiryDuration(CacheExpiryDuration),
task.WithRemoteCacheDir(RemoteCacheDir),
task.WithWatch(Watch), task.WithWatch(Watch),
task.WithVerbose(Verbose), task.WithVerbose(Verbose),
task.WithSilent(Silent), task.WithSilent(Silent),

View File

@@ -153,16 +153,16 @@ func (e *Executor) setupTempDir() error {
} }
} }
remoteDir := env.GetTaskEnv("REMOTE_DIR") // RemoteCacheDir from taskrc/env can override the remote cache directory
if remoteDir != "" { if e.RemoteCacheDir != "" {
if filepath.IsAbs(remoteDir) || strings.HasPrefix(remoteDir, "~") { if filepath.IsAbs(e.RemoteCacheDir) || strings.HasPrefix(e.RemoteCacheDir, "~") {
remoteTempDir, err := execext.ExpandLiteral(remoteDir) remoteCacheDir, err := execext.ExpandLiteral(e.RemoteCacheDir)
if err != nil { if err != nil {
return err return err
} }
e.TempDir.Remote = remoteTempDir e.TempDir.Remote = remoteCacheDir
} else { } else {
e.TempDir.Remote = filepathext.SmartJoin(e.Dir, ".task") e.TempDir.Remote = filepathext.SmartJoin(e.Dir, e.RemoteCacheDir)
} }
} }

View File

@@ -24,6 +24,7 @@ type Remote struct {
Offline *bool `yaml:"offline"` Offline *bool `yaml:"offline"`
Timeout *time.Duration `yaml:"timeout"` Timeout *time.Duration `yaml:"timeout"`
CacheExpiry *time.Duration `yaml:"cache-expiry"` CacheExpiry *time.Duration `yaml:"cache-expiry"`
CacheDir *string `yaml:"cache-dir"`
TrustedHosts []string `yaml:"trusted-hosts"` TrustedHosts []string `yaml:"trusted-hosts"`
} }
@@ -46,6 +47,7 @@ func (t *TaskRC) Merge(other *TaskRC) {
t.Remote.Offline = cmp.Or(other.Remote.Offline, t.Remote.Offline) t.Remote.Offline = cmp.Or(other.Remote.Offline, t.Remote.Offline)
t.Remote.Timeout = cmp.Or(other.Remote.Timeout, t.Remote.Timeout) t.Remote.Timeout = cmp.Or(other.Remote.Timeout, t.Remote.Timeout)
t.Remote.CacheExpiry = cmp.Or(other.Remote.CacheExpiry, t.Remote.CacheExpiry) t.Remote.CacheExpiry = cmp.Or(other.Remote.CacheExpiry, t.Remote.CacheExpiry)
t.Remote.CacheDir = cmp.Or(other.Remote.CacheDir, t.Remote.CacheDir)
if len(other.Remote.TrustedHosts) > 0 { if len(other.Remote.TrustedHosts) > 0 {
merged := slices.Concat(other.Remote.TrustedHosts, t.Remote.TrustedHosts) merged := slices.Concat(other.Remote.TrustedHosts, t.Remote.TrustedHosts)

View File

@@ -308,6 +308,7 @@ remote:
offline: false offline: false
timeout: "30s" timeout: "30s"
cache-expiry: "24h" cache-expiry: "24h"
cache-dir: ~/.task
trusted-hosts: trusted-hosts:
- github.com - github.com
- gitlab.com - gitlab.com
@@ -360,6 +361,19 @@ remote:
cache-expiry: "6h" cache-expiry: "6h"
``` ```
#### `cache-dir`
- **Type**: `string`
- **Default**: `.task`
- **Description**: Directory where remote Taskfiles are cached. Can be an
absolute path (e.g., `/var/cache/task`) or relative to the Taskfile directory.
- **Environment variable**: `TASK_REMOTE_DIR` (lower priority than config file)
```yaml
remote:
cache-dir: ~/.task
```
#### `trusted-hosts` #### `trusted-hosts`
- **Type**: `array of strings` - **Type**: `array of strings`