1
0
mirror of https://github.com/go-task/task.git synced 2025-08-10 22:42:19 +02:00

feat: resolve variables in vars declarations too

This commit is contained in:
Pete Davison
2023-12-30 17:57:23 +00:00
parent bff0a0a3d4
commit 25b1966506
3 changed files with 49 additions and 6 deletions

View File

@@ -179,12 +179,12 @@ tasks:
- 'echo {{.FOO.b}}' - 'echo {{.FOO.b}}'
``` ```
## Parsing variables by reference ## Variables by reference
Lastly, this proposal adds support for parsing variables by reference. This is Lastly, this proposal adds support for defining and passing variables by
really important now that variables can be types other than a string. reference. This is really important now that variables can be types other than a
Previously, to send a variable from one task to another, you would have to use string. Previously, to send a variable from one task to another, you would have
the templating system to pass it: to use the templating system to pass it:
```yaml ```yaml
version: 3 version: 3
@@ -225,7 +225,20 @@ tasks:
``` ```
This means that the type of the variable is maintained when it is passed to This means that the type of the variable is maintained when it is passed to
another Task. another Task. This also works when defining a variable:
```yaml
version: 3
tasks:
foo:
vars:
FOO: [A, B, C] # <-- FOO is defined as an array
BAR:
ref: FOO # <-- BAR is defined as a reference to FOO
cmds:
- 'echo {{index .BAR 0}}' # <-- BAR refers to FOO so the task outputs 'A'
```
</TabItem></Tabs> </TabItem></Tabs>

View File

@@ -71,6 +71,10 @@ func (c *Compiler) getVariables(t *ast.Task, call *ast.Call, evaluateShVars bool
newVar.Json = tr.Replace(v.Json) newVar.Json = tr.Replace(v.Json)
newVar.Yaml = tr.Replace(v.Yaml) newVar.Yaml = tr.Replace(v.Yaml)
newVar.Dir = v.Dir newVar.Dir = v.Dir
// If the variable is a reference, we can resolve it
if newVar.Ref != "" {
newVar.Value = result.Get(newVar.Ref).Value
}
// If the variable should not be evaluated, but is nil, set it to an empty string // If the variable should not be evaluated, but is nil, set it to an empty string
// This stops empty interface errors when using the templater to replace values later // This stops empty interface errors when using the templater to replace values later
if !evaluateShVars && newVar.Value == nil { if !evaluateShVars && newVar.Value == nil {

View File

@@ -16,6 +16,32 @@ tasks:
VAR: VAR:
ref: MAP ref: MAP
map-ref:
vars:
MAP:
map: {"name":"Alice","age":30,"children":[{"name":"Bob","age":5},{"name":"Charlie","age":3},{"name":"Diane","age":1}]}
MAP_REF:
ref: MAP
cmds:
- task: print-var
vars:
VAR:
ref: MAP_REF
map-ref-sh:
vars:
JSON_STRING:
sh: echo '{"name":"Alice","age":30,"children":[{"name":"Bob","age":5},{"name":"Charlie","age":3},{"name":"Diane","age":1}]}'
JSON:
json: "{{.JSON_STRING}}"
MAP_REF:
ref: JSON
cmds:
- task: print-var
vars:
VAR:
ref: MAP_REF
json: json:
vars: vars:
JSON_STRING: JSON_STRING: