问题描述
所以这个问题之前似乎已经问过几次了,但之前的答案都不适合我,我从错误到错误再到没有结果。
因此,因为我肯定遗漏了一些我看不到的东西,所以我想寻求帮助:
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)