--- slug: /experiments/any-variables/ --- # Any Variables - Issue: #1415 - Environment variable: `TASK_X_ANY_VARIABLES=1` - Breaks: - Dynamically defined variables (using the `sh` keyword) Currently, Task only supports string variables. This experiment allows you to specify and use the following variable types: - `string` - `bool` - `int` - `float` - `array` - `map` This allows you to have a lot more flexibility in how you use variables in Task's templating engine. For example: Evaluating booleans: ```yaml version: 3 tasks: foo: vars: BOOL: false cmds: - '{{if .BOOL}}echo foo{{end}}' ``` Arithmetic: ```yaml version: 3 tasks: foo: vars: INT: 10 FLOAT: 3.14159 cmds: - 'echo {{add .INT .FLOAT}}' ``` Ranging: ```yaml version: 3 tasks: foo: vars: ARRAY: [1, 2, 3] cmds: - 'echo {{range .ARRAY}}{{.}}{{end}}' ``` There are many more templating functions which can be used with the new types of variables. For a full list, see the [slim-sprig][slim-sprig] documentation. ## Looping over variables Previously, you would have to use a delimiter separated string to loop over an arbitrary list of items in a variable and split them by using the `split` subkey to specify the delimiter: ```yaml version: 3 tasks: foo: vars: LIST: 'foo,bar,baz' cmds: - for: var: LIST split: ',' cmd: echo {{.ITEM}} ``` Because this experiment adds support for array variables, the `for` keyword has been updated to support looping over arrays directly: ```yaml version: 3 tasks: foo: vars: LIST: [foo, bar, baz] cmds: - for: var: LIST cmd: echo {{.ITEM}} ``` String splitting is still supported and remember that for simple cases, you have always been able to loop over an array without using variables at all: ```yaml version: 3 tasks: foo: cmds: - for: [foo, bar, baz] cmd: echo {{.ITEM}} ``` ## Migration Taskfiles with dynamically defined variables via the `sh` subkey will no longer work with this experiment enabled. In order to keep using dynamically defined variables, you will need to migrate your Taskfile to use the new syntax. Previously, you might have defined a dynamic variable like this: ```yaml version: 3 task: foo: vars: CALCULATED_VAR: sh: 'echo hello' cmds: - 'echo {{.CALCULATED_VAR}}' ``` With this experiment enabled, you will need to remove the `sh` subkey and define your command as a string that begins with a `$`. This will instruct Task to interpret the string as a command instead of a literal value and the variable will be populated with the output of the command. For example: ```yaml version: 3 task: foo: vars: CALCULATED_VAR: '$echo hello' cmds: - 'echo {{.CALCULATED_VAR}}' ``` If your current Taskfile contains a string variable that begins with a `$`, you will now need to escape the `$` with a backslash (`\`) to stop Task from executing it as a command. [slim-sprig]: https://go-task.github.io/slim-sprig/