Recursive Rendering¶
Note: This is an experimental feature introduced in version 0.16. It is subject to change or removal in future versions. Use at your own risk.
Recursive rendering is a concept similar to macros, perhaps aimed at obsoleting it altogether one day. For now, both of these live side by side.
The idea behind recursive rendering is simple:
- The template is rendered recursively until it stops changing.
- Spec values can contain references to other spec or config values.
Note two things:
- Maximum number of rendering passes is always limited to a reasonably
small integer (currently passed via
--max-passes X
on command line) to make sure the re-rendering loop ends. - Recursive rendering is currently turned off, as
--max-passes
is set to1
.
Example¶
Let’s consider the following spec:
name: "myname"
help: "This is a help for {{ config.os.id }}/{{ spec.myname }} image."
Let’s try rendering a very simple template that looks like this:
{{ spec.help }}
- In the first rendering pass,
{{ spec.help }}
will get substitued. - In the second rendering pass,
{{ config.os.id }}
and{{ spec.myname }}
will get substitued. - The third rendering pass will find out that there are no changes and will end recursive rendering (so 3 passes are necessary).
Usage¶
As of now, recursive rendering is turned off by default (in other words,
there’s just one rendering pass). To turn it on, pass a number higher than
2 to dg
‘s --max-passes
commandline switch. For example:
dg --distro fedora-26-x86_64.yaml --spec myspec.yaml --template Dockerfile --max-passes 10