在我的模板中,我使用带有如下参数的范围:
{{- range $key, $value := .Values.myParam }}
---
fieldOne: $value.fieldOne
fieldTwo: $value.fieldTwo
myFunc: {{- include "myFunc" $ }}
{{ end }}
我希望 myFunc 能够访问全局值 (
.Values.global.*
) 以及作用域变量,例如 $value.fieldOne
和 $value.fieldTwo
。这可能吗?
如果我不传递 myFunc
$
,它将无法访问全局变量。如果不传递它$value
,它将无法访问范围值。
而且我想维护标准的
.Values.global.*
引用语法来访问 myFunc 内的全局变量 - 我不想创建自己的特殊映射对象,该函数必须以不同的方式读取。
目前我正在做这个:
myFunc: {{- include "myFunc" (merge $ $value) }}
然后在 myFunc 中我可以访问这个:
{{- define "myFunc" -}}
# Get globals in the usual way
{{- .Values.global.myGlobal }}
# Get my scoped values for the current iteration
{{- .fieldOne }}
{{- .fieldTwo }}
{{- end -}}
这是唯一的方法吗?它似乎工作得相当好,但我想确认没有像
.
这样的内置函数,但对于范围范围的变量,我可以在 myFunc 中使用。
我发现我的方法有一个问题,似乎在函数内部调用 merge 正在改变根映射。
例如这样做:
# helper function
{{- define "myFunc" -}}
# Get globals in the usual way
someGlobal: {{- .Values.global.myGlobal }}
# Get my scoped values for the current iteration
fieldOne: {{- .fieldOne }}
fieldTwo: {{- .fieldTwo }}
{{- end -}}
# In a template
{{- range $key, $value := .Values.myParam }}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: $value.fieldOne
data:
{{- include "myFunc" (merge $ $value) }}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: $value.fieldOne
data:
{{- include "myFunc" (merge $ $value) }}
{{ end }}
当我查看输出的配置映射时,从 myFunc 返回的值是相同的。我还注意到我可以做到这一点:
# In a template
{{- range $key, $value := .Values.myParam }}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: $value.fieldOne
data:
{{- include "myFunc" (merge $ $value) }}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: $value.fieldOne
data:
someGlobal: {{ .Values.global.myGlobal }}
fieldOne: {{ $value.fieldOne }}
fieldTwo: {{ $value.fieldTwo }
{{ end }}
在第二个
ConfigMap
中,值与第一个相同。这就像在 myFunc 中调用 merge 正在改变根映射。
最终我必须将逻辑移出 myFunc 并直接在模板中调用 merge 以避免这种情况 - 这样做每次迭代都能正确获取其项目的值。
Go
text/template
模板仅采用一个参数。与其他编程语言一样,函数(模板)无法访问其调用者中的局部变量,只能访问在参数中显式传递的内容。
简而言之:考虑到模板语言的限制,您现在的方式或多或少已经是尽可能好的了。如果你想直接引用
.Values
那么单个模板参数必须是字典对象而不是其他东西。