我正在尝试gomplate并遇到错误。
对于上下文,我定义了一个模板文件 test.tmplt 和一个数据源文件 dev.yaml。
test.tmplt 具有以下内容:
localAPIEndpoint:
advertiseAddress: {{ (datasource "k8s").api-advertise-ip }}
Run Code Online (Sandbox Code Playgroud)
而 dev.yaml 包含以下内容:
api-advertise-ip: 192.168.0.1
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用 gomplate 填写 test.tmplt 的内容,如下所示:
gomplate -d k8s=./dev.yaml -f ./test.tmplt -o test.conf
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
09:42:44 FTL error="template: ./test.tmplt:2: bad character U+002D '-'"
Run Code Online (Sandbox Code Playgroud)
在我看来,它不喜欢模板文件中的“-”符号。有解决方法吗?这是预期的行为吗?
编辑 1:感谢@icza 提供的答案对于上面的示例正确有效。然而,如果我修改 yaml 文件以包含嵌套字段,它似乎就会崩溃。
例如
开发.yaml:
kubernetes:
api-advertise-ip: 192.168.0.0
Run Code Online (Sandbox Code Playgroud)
测试.tmplt:
localAPIEndpoint:
advertiseAddress: {{ index (datasource "k8s") "kubernetes.api-advertise-ip" }}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,输出:
gomplate -d k8s=./dev.yaml -f ./test.tmplt -o test.conf
Run Code Online (Sandbox Code Playgroud)
是 :
localAPIEndpoint:
advertiseAddress: <no value>
Run Code Online (Sandbox Code Playgroud)
您的"k8s"
数据源是 YAML 配置,您想要访问api-advertise-ip
它的属性。
由于api-advertise-ip
包含破折号,因此您不能在模板中按原样使用该名称,因为这是一个语法错误:模板引擎尝试用作api
属性名称,而后面的破折号是一个语法错误。
您必须将属性名称放在包含破折号的引号中:"api-advertise-ip"
,但是使用.
选择器的这种语法也是无效的语法。
使用内置index
函数通过此键索引 YAML 数据源:
localAPIEndpoint:
advertiseAddress: {{ index (datasource "k8s") "api-advertise-ip" }}
Run Code Online (Sandbox Code Playgroud)
gomplate
text/template
在幕后使用,请参阅Go Playground上的工作示例。
当使用index
并且您有多个嵌套级别时,请将每个键作为附加参数提供给index
.
例如:
localAPIEndpoint:
advertiseAddress: {{ index (datasource "k8s") "kubernetes" "api-advertise-ip" }}
Run Code Online (Sandbox Code Playgroud)
在Go Playground上试试这个。