08-动作&控制结构

下面是一个action(动作)的列表。"Arguments"和"pipelines"代表数据的执行结果,细节定义在后面。

注释

{{/* a comment */}}

// 注释执行时会忽略可以多行注释不能嵌套并且必须紧贴分界符始止就像这里表示的一样

管道

模板语言的强大功能之一是其管道概念。利用 UNIX 的概念,管道是一个链接在一起的一系列模板命令的工具,以紧凑地表达一系列转换。管道是按顺序完成几件事情的有效方式。

{{pipeline}}

//  pipeline的值的默认文本表示会被拷贝到输出里

Pipeline是一个(可能是链状的)command序列。Command可以是一个简单值(argument)或者对函数或者方法的(可以有多个参数的)调用:

  1. Argument 执行结果是argument的执行结果;
  2. .Method [Argument...] 方法可以独立调用或者位于链式调用的末端,不同于链式调用中间的方法,可以使用参数; 执行结果是使用给出的参数调用该方法的返回值:dot.Method(Argument1, etc.);
  3. functionName [Argument...] 执行结果是使用给定的参数调用函数名指定的函数的返回值:function(Argument1, etc.)

pipeline通常是将一个command序列分割开,再使用管道符'|'连接起来(但不使用管道符的command序列也可以视为一个管道)。在一个链式的pipeline里,每个command的结果都作为下一个command的最后一个参数。pipeline最后一个command的输出作为整个管道执行的结果。

command的输出可以是1到2个值,如果是2个后一个必须是error接口类型。如果error类型返回值非nil,模板执行会中止并将该错误返回给执行模板的调用者。

如果值为如下情况,则pipeline为 false:

  • 一个布尔型的false
  • 一个数字零
  • 一个空的字符串
  • 一个 nil(空或 null)
  • 一个空的集合(map,slice,tuple,dict,array)

在其他情况下,条件值为true,此管道被执行。

控制结构

控制结构(模板说法中称为 “动作”)为编写模板提供了控制模板生成流程的能力。Helm 的模板语言提供了以下控制结构:

  • if/else:用于创建条件块
  • with:指定范围
  • range:提供一个“for each“风格的循环

控制结构可以执行整个管道,而不是一个值。

if/else

{{if pipeline}}
// T0
{{else if pipeline}}
// T1
{{else}}
// T2
{{end}}

// pipeline的执行不改变dot的值

with

with控制着变量作用域,.是对当前范围的引用,即.Values是告诉模板,在当前范围内查找Values对象。

{{with pipeline}}
// 限定的范围
{{end}}

// 修改当前dot,不修改外面的dot

// 请注意在受限范围内此时将无法从父范围访问其他对象
{{with pipeline}}
T1
{{else}}
T0
{{end}}

// 如果pipeline为空不改变dot并执行T0否则dot设为pipeline的值并执行T1

循环range

在Helm模板中,遍历集合(数组、切片、字典或者通道)的方式是使用range操作。

  1. 如果pipeline的值其长度为0,不会有任何输出;
  2. 否则dot依次设为数组、切片、字典或者通道的每一个成员元素并执行pipeline;

如果pipeline的值为字典,且键是可排序的基本类型,元素也会按键的顺序排序。

{{range pipeline}}
T1
{{else}}
T0
{{end}}

// 不改变dot的值
上次修改: 14 April 2020