我使用vscode作为编辑器,项目中有几个发生参数替换的yaml文件。但是,它仅重新格式化一个文件,其中括号之间有额外的空格,该文件是 helm 在我们的 ci/cd 管道中使用的名为 service.yaml 的文件。请参阅下面的之前和之后。
我想知道文件名对于 vscode 或任何其他扩展是否有特殊意义......谢谢。
解决此问题的方法之一 - 将值括在引号中。
像这样:
app: "{{ .Values.name }}"
可能不是最好的解决方案,但它对我有用。
TL;DR - 只需将所有 helm .yaml 文件添加到 .prettierignore,因为它们包含 go 文本模板并且无论如何都不应该是有效的 YAML。
我在 Prettier 上遇到了同样的问题,并做了一些调查。实际的答案是 helm 生成的 service.yaml 文件看起来像实际的 YAML,其中
{{...}}
中包含的所有内容都被解释为一个值。当 prettier 在 service.yaml 上运行时,它只是根据 prettier 设置格式化文件内容,并且 prettier 控制台显示成功的 prettier 运行:
["INFO" - 10:37:59 PM] Formatting completed in 20ms.
这会使文件处于错误状态,因为
{ { .Values.service.port } }
不是有效的 go 模板,因此无法由 helm 渲染。
但是,所有其他 helm 生成的 .yaml 文件都有一些用于在不属于有效 YAML 语法的地方渲染文本的 go 模板。例如,我的 serviceaccount.yaml 文件开头为:
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
...
请注意,这不是有效的 YAML 语法,因此 Prettier 会抛出错误,并在 Prettier 控制台中输出类似以下内容:
["ERROR" - 10:21:24 PM] Error formatting document.
["ERROR" - 10:21:24 PM] Document contains trailing content not separated by a ... or --- line (2:1)
1 | {{- if .Values.serviceAccount.create -}}
> 2 | apiVersion: v1
| ^^^^^^^^^^^^^^
> 3 | kind: ServiceAccount
| ^^^^^^^^^^^^^^^^^^^^
> 4 | metadata:
| ^^^^^^^^^^^^^^^^^^^^
...<a whole lot of other errors followed by a stack trace>
["INFO" - 10:21:24 PM] Formatting completed in 21ms.
(好吧,好吧,从技术上讲,第一行实际上是有效的 YAML 文档,但在下一行中跟随
apiVersion: v1
需要在流中使用 ...
或 ---
线在流中使用新的文档分隔符,这会破坏无论如何掌舵)
由于 prettier 无法成功将文件格式化为 YAML,因此它只会按原样保留文件。
由于 helm 模板并非纯 YAML,因此解决方案很可能只是将所有这些文件添加到 .prettierignore 并继续生活。