是否有一种本机方法可以从函数内部访问范围内的范围?

问题描述 投票:0回答:1

在我的模板中,我使用带有如下参数的范围:

{{- 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 以避免这种情况 - 这样做每次迭代都能正确获取其项目的值。

kubernetes-helm go-templates
1个回答
1
投票

Go

text/template
模板仅采用一个参数。与其他编程语言一样,函数(模板)无法访问其调用者中的局部变量,只能访问在参数中显式传递的内容。

简而言之:考虑到模板语言的限制,您现在的方式或多或少已经是尽可能好的了。如果你想直接引用

.Values
那么单个模板参数必须是字典对象而不是其他东西。

© www.soinside.com 2019 - 2024. All rights reserved.