-
-
Notifications
You must be signed in to change notification settings - Fork 624
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
182 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,182 @@ | ||
--- | ||
title: Any Variables | ||
description: Task is no longer limited to strings! | ||
slug: any-variables | ||
authors: [pd93] | ||
tags: [experiments, variables] | ||
image: https://i.imgur.com/mErPwqL.png | ||
hide_table_of_contents: false | ||
draft: true | ||
--- | ||
|
||
import Tabs from '@theme/Tabs'; | ||
import TabItem from '@theme/TabItem'; | ||
|
||
Task has always had variables, but even though you were able to define them | ||
using different YAML types, they would always be converted to strings by Task. | ||
This limited users to string manipulation and encouraged messy workarounds for | ||
simple problems. Starting from [v3.36.0][v3.36.0], this is no longer the case! | ||
Task now supports most variable types, including **booleans**, **integers**, | ||
**floats** and **arrays**! | ||
|
||
<!--truncate--> | ||
|
||
## What's the big deal? | ||
|
||
These changes allow you to use variables in a much more natural way and opens up | ||
a wide variety of sprig functions that were previously useless. Take a look at | ||
some of the examples below for some inspiration. | ||
|
||
### Evaluating booleans | ||
|
||
No more comparing strings to "true" or "false". Now you can use actual boolean | ||
values in your templates: | ||
|
||
<Tabs defaultValue="2" | ||
values={[ | ||
{label: 'Before', value: '1'}, | ||
{label: 'After', value: '2'} | ||
]}> | ||
|
||
<TabItem value="1"> | ||
|
||
```yaml | ||
version: 3 | ||
|
||
tasks: | ||
foo: | ||
vars: | ||
BOOL: true # <-- Parsed as a string even though its a YAML boolean | ||
cmds: | ||
- '{{if eq .BOOL "true"}}echo foo{{end}}' | ||
``` | ||
</TabItem> | ||
<TabItem value="2"> | ||
```yaml | ||
version: 3 | ||
|
||
tasks: | ||
foo: | ||
vars: | ||
BOOL: true # <-- Parsed as a boolean | ||
cmds: | ||
- '{{if .BOOL}}echo foo{{end}}' # <-- No need to compare to "true" | ||
``` | ||
</TabItem></Tabs> | ||
### Arithmetic | ||
You can now perform basic arithmetic operations on integer and float variables: | ||
```yaml | ||
version: 3 | ||
|
||
tasks: | ||
foo: | ||
vars: | ||
INT: 10 | ||
FLOAT: 3.14159 | ||
cmds: | ||
- 'echo {{add .INT .FLOAT}}' | ||
``` | ||
You can use any of the following arithmetic functions: `add`, `sub`, `mul`, | ||
`div`, `mod`, `max`, `min`, `floor`, `ceil`, `round` and `randInt`. Check out | ||
the [slim-sprig math documentation][slim-sprig-math] for more information. | ||
|
||
### Arrays | ||
|
||
You can now range over arrays inside templates and use list-based functions: | ||
|
||
```yaml | ||
version: 3 | ||
tasks: | ||
foo: | ||
vars: | ||
ARRAY: [1, 2, 3] | ||
cmds: | ||
- 'echo {{range .ARRAY}}{{.}}{{end}}' | ||
``` | ||
|
||
You can use any of the following list-based functions: `first`, `rest`, `last`, | ||
`initial`, `append`, `prepend`, `concat`, `reverse`, `uniq`, `without`, `has`, | ||
`compact`, `slice` and `chunk`. Check out the [slim-sprg lists | ||
documentation][slim-sprig-list] for more information. | ||
|
||
### Looping over variables using `for` | ||
|
||
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. However, we have now added support for looping over | ||
"collection-type" variables using the `for` keyword, so now you are able to loop | ||
over list variables directly: | ||
|
||
<Tabs defaultValue="2" | ||
values={[ | ||
{label: 'Before', value: '1'}, | ||
{label: 'After', value: '2'} | ||
]}> | ||
|
||
<TabItem value="1"> | ||
|
||
```yaml | ||
version: 3 | ||
tasks: | ||
foo: | ||
vars: | ||
LIST: 'foo,bar,baz' | ||
cmds: | ||
- for: | ||
var: LIST | ||
split: ',' | ||
cmd: echo {{.ITEM}} | ||
``` | ||
|
||
</TabItem> | ||
<TabItem value="2"> | ||
|
||
```yaml | ||
version: 3 | ||
tasks: | ||
foo: | ||
vars: | ||
LIST: ['foo', 'bar', 'baz'] | ||
cmds: | ||
- for: | ||
var: LIST | ||
cmd: echo {{.ITEM}} | ||
``` | ||
|
||
</TabItem></Tabs> | ||
|
||
## What about maps? | ||
|
||
Maps were originally included in the Any Variables experiment. However, they | ||
weren't quite ready yet. Instead of making you wait for everything to be ready | ||
at once, we have released support for all other variable types and we will | ||
continue working on map support in the new "[Map Variables][map-variables]" | ||
experiment. | ||
|
||
:::note | ||
|
||
If you were previously using maps with the Any Variables experiment and wish to | ||
continue using them, you will need to enable the new [Map Variables | ||
experiment][map-variables] instead. | ||
|
||
::: | ||
|
||
We're looking for feedback on a couple of different proposals, so please give | ||
them a go and let us know what you think. :pray: | ||
|
||
<!-- prettier-ignore-start --> | ||
[v3.36.0]: https://github.com/go-task/task/releases/tag/v3.36.0 | ||
[slim-sprig-math]: https://go-task.github.io/slim-sprig/math.html | ||
[slim-sprig-list]: https://go-task.github.io/slim-sprig/lists.html | ||
[map-variables]: /experiments/map-variables | ||
<!-- prettier-ignore-end --> |