Go 模板 missingkey 选项总是 return 错误

Go template missingkey option always return error

所以这个问题之前似乎已经被问过几次了,但是 none 之前的答案对我有用,我从错误到错误再到没有结果。

所以我肯定遗漏了一些我没有看到的东西,我想得到一些帮助:

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 的文件 (path/file)。结果文件应该是 yaml 所以我删除了最后一部分以生成结果文件名。

然后我用 go 模板解析文件,然后用我生成的 configmap 执行。

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

所以我尝试像这样在模板解析文件中添加选项:

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

但是我不能使用模板 Exectute 并且必须使用模板 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:playground

目前 playground 只是忽略错误并执行模板,即使传递的配置为空并且模板中没有 or 条件也是如此。

ParseFiles method 文档说:

Since the templates created by ParseFiles are named by the base names of the argument files, t should usually have the name of one of the (base) names of the files.

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

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

Run an example on the Playground.