去模板缺少键选项总是返回错误

问题描述

所以这个问题之前似乎已经问过几次了,但之前的答案都不适合我,我从错误错误再到没有结果。

因此,因为我肯定遗漏了一些我看不到的东西,所以我想寻求帮助:

res,err := os.Create(strings.Replace(f,".tmpl","",-1))
if err != nil {
  log.Fatal(err)
}

t,err := template.ParseFiles(f)
if err != nil {
  log.Fatal(err)
}

removes = append(removes,res.Name())

config := make(map[string]string)
for _,v := range vars {
  config[v] = os.Getenv(v)
}

err = t.Execute(res,config)
if err != nil {
  log.Fatal(err)
}

res.Close()

为了解释我在做什么,我将一个字符串传递给一个具有 yaml.tmpl 扩展名的文件(路径/文件)。结果文件应该是 yaml,所以我删除了最后一部分以生成结果文件名。

然后我使用 go 模板解析文件,然后使用我生成的配置映射执行。

这样工作正常,但我想添加.Option("missingkey=error") 让它生成错误,以防我没有将 configmap 中的值提供给模板中的变量。

所以我尝试在模板解析文件添加选项,如下所示:

t,err := template.New("test").Option("missingkey=error").ParseFiles(f)

但是我不能使用模板 Executute 并且必须使用模板 ExecuteTemplate 但是我得到的: template: no template "test" associated with template "test"template: test: "test" is an incomplete or empty template

在极少数情况下我没有收到错误,它只是忽略选项,就像我这样做一样:

err = t.Option("missingkey=error").Execute(res,config)

有人知道我做错了什么吗?

编辑

我用 Cerise Limon 的回答更新了代码,这里是操场:playground

目前,即使传递的配置为空并且模板中没有 or 条件,该操场也会忽略错误并执行模板。

解决方法

ParseFiles method 文档说:

由于 ParseFiles 创建的模板是由参数文件的基本名称命名的,因此 t 通常应该具有文件的(基本)名称之一的名称。

使用 filepath.Base 获取文件的基本名称。使用该名称作为模板的名称:

 t,err := template.New(filepath.Base(f)).Option("missingkey=error").ParseFiles(f)

Run an example on the Playground