Как сделать отступ содержимого включенного шаблона

Я использую шаблоны go для создания определений yaml для kubernetes. Я пытаюсь вложить шаблоны, но сталкиваюсь с проблемами, когда я не могу повторно использовать определение просто потому, что отступ при включении неверен. То есть в одном случае содержимое нуждается в отступе, а в другом нет. Как я могу контролировать отступ включенного контента?

Пример ниже. Я повторно использую pod.tmpl, в первом случае его можно включить как есть. Во втором случае мне нужно сделать отступ для всего содержимого, чтобы оно стало членом службы.

{{ if (eq .Case "pod")
  # NO indenting
  {{ template "pod" }}
{{ end }}

{{ if (eq .Case "service")
  service:
    # need to indent! so contents become members of service:
    {{ template "pod" }}
{{ end }}

person dirtbikejunkie    schedule 06.05.2017    source источник
comment
Почему бы не использовать синтаксический анализатор YAML вместо универсального механизма текстовых шаблонов? Мне кажется, вы используете не тот инструмент для работы здесь. При этом, если вам не нужны пробелы, то... не вводите их?   -  person Martin Tournoij    schedule 06.05.2017


Ответы (4)


Ответ @Giovanni Bassi работает только в руле. Функция include определена в helm здесь.

В сочетании с ответом @tmirks indent from sprig вы получите :

func renderTemplate(templatePath string, vars interface{}, out io.Writer) error {
    t := template.New(filepath.Base(templatePath))
    var funcMap template.FuncMap = map[string]interface{}{}
    // copied from: https://github.com/helm/helm/blob/8648ccf5d35d682dcd5f7a9c2082f0aaf071e817/pkg/engine/engine.go#L147-L154
    funcMap["include"] = func(name string, data interface{}) (string, error) {
        buf := bytes.NewBuffer(nil)
        if err := t.ExecuteTemplate(buf, name, data); err != nil {
            return "", err
        }
        return buf.String(), nil
    }

    t, err := t.Funcs(sprig.TxtFuncMap()).Funcs(funcMap).ParseFiles(templatePath)
    if err != nil {
        return err
    }
    err = t.Execute(out, &vars)
    if err != nil {
        return err
    }
    return nil
}

тогда

{{ include "pod" | indent 4 }}
person s12chung    schedule 19.12.2019

Вы должны иметь возможность направить вывод вашего шаблона в функцию indent, доступную в пакете sprig:

{{ if (eq .Case "service")
  service:
    # need to indent! so contents become members of service:
{{ template "pod" | indent 4 }}
{{ end }}
person tmirks    schedule 17.05.2017

Вы можете делать отступы свободно, но вам нужно использовать include вместо template, так как template является действием и не может быть передано другим функциям:

{{ include "pod" | indent 4 }}

Дополнительные сведения см. в руководстве по Helm.

person Giovanni Bassi    schedule 24.10.2019

Я обнаружил, что могу обойти проблему, если сделаю отступ для содержимого pod.tmpl, а затем отступ в верхней части для выравнивания, как показано ниже.

{{ if (eq $template "pod.tmpl") }}
    apiVersion: v1
    kind: Pod
{{ end }}
{{ if (eq $template "deployment.tmpl") }}
apiVersion: v1
kind: Deployment
metadata:
  name: {{ .Name }}-deployment
spec:
  replicas: {{ .Scale }}
  template:
{{template "pod" dict "Version" $version "Domain" $domain "Image" $image "ImageDerived" $imageDerived "Service" . }}
person dirtbikejunkie    schedule 06.05.2017