У меня есть несколько файлов YAML в каталоге диаграмм, и в моем шаблоне я хочу использовать их содержимое в массиве. Например, если бы у меня было 2 файла:
# file-a.yaml:
name: abc
# file-b.yaml:
name: xyz
И мой шаблон:
{{ printf "files:" | nindent 8 -}}
{{- range $stagesPath, $fileContent := $.Files.Glob (printf "files/*.yaml") }}
- {{ $.Files.Get $stagesPath | toYaml | nindent 10 }}
{{- end }}
будет отображать:
files:
-
|
name: abc
-
|
name: xyz
Но я хочу:
files:
- name: abc
- name: xyz
Не могли бы вы мне помочь? :)
.Files.Get
уже возвращает строку. Когда вы передаете его через toYaml
, строка оказывается дважды экранированной. Возможно, именно поэтому вы остановились на блочно-скалярном синтаксисе YAML.
Поскольку у вас уже есть содержимое файла в виде строки, toYaml
вам не нужен. Вам нужно indent
, чтобы он правильно вписывался в синтаксис содержащего его блока YAML, но затем trim
ведущий пробел, чтобы первая строка не была с чрезмерным отступом.
files:
{{- range $stagesPath := $.Files.Glob (printf "files/*.yaml") }}
- {{ $.Files.Get $stagesPath | indent 10 | trim }}
{{- end }}
В принципе, вы можете использовать fromYaml
для преобразования содержимого файла в структурированное значение. В языке шаблонов нет какой-либо функции map
, поэтому создать список значений данных, а затем выгрузить его, сложно. Это, вероятно, работает (чтение каждого файла, его анализ fromYaml
, сбор каждого элемента в список, а затем прохождение всего списка toYaml
один раз):
{{- $files := list }}
{{- range $stagesPath := .Files.Glob "files/*.yaml" }}
{{- $files = append $files ($.Files.Get $stagesPath | fromYaml) }}
{{- end }}
files: {{- $files | toYaml | nindent 10 }}