gpt4 book ai didi

go - 有没有办法验证/解析其中包含 go-template 变量的 YAML 文件?

转载 作者:行者123 更新时间:2023-12-01 22:35:50 25 4
gpt4 key购买 nike

我有一个“YAML”文件。我想在渲染其中的 go-template 变量之前验证它。例如:

apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | default "tea" | quote }}
food: {{ .Values.favorite.food | upper | quote }}

典型的 YAML 解析器在这里不起作用,因为它将解析 { 作为映射的开始。

err := yaml.Unmarshal(data, &Content)
// Failed to parse the provided YAML: yaml: line 4: did not find expected key

不知道有没有什么包可以帮我做到这一点?我在网上搜索了一段时间,但没有运气。感谢您的帮助!

最佳答案

不仅仅是 YAML 解析器提示:实际上是无效的 YAML(因为 {...} 是内联映射语法)。看起来它来自 Kubernetes Helm部署工具,以及一些常规但有趣的用途实际上需要呈现 YAML。

在实践中你可能想要的是使用 helm template命令将图表呈现为多文档 YAML,然后在其上运行 YAML 验证器。它似乎没有记录在案,但 Helm 版本 3 实际上会自行执行此验证(Helm 2 不会),因此如果您的图表生成无效的 YAML,您将在此时收到错误消息。

Helm 的工作方式是,它将此“YAML”文件解释为纯文本文件并对其应用 Go text/template 模板,然后将其作为 YAML 读回。在某种程度上,您可以通过自己引用字符串来制作此有效的 YAML:

name: "{{ .Release.Name }}-configmap"

但是有一些相当常见的构造实际上会破坏生成的 YAML。例如,helm create 模板 generates

{{/* _helpers.tpl */}}
{{- define "<CHARTNAME>.labels" -}}
helm.sh/chart: {{ include "<CHARTNAME>.chart" . }}
{{- end -}}
metadata:
name: {{ include "<CHARTNAME>.fullname" . }}
labels:
{{- include "<CHARTNAME>.labels" . | nindent 4 }}

再多的引用也无法使这个 YAML 有效。很有可能将一些在 YAML 映射上下文中无效的内容放入“标签”帮助程序模板中,而您想在验证阶段捕获它。

关于go - 有没有办法验证/解析其中包含 go-template 变量的 YAML 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63270815/

25 4 0