有没有办法在 YAML 中使用占位符,如下所示:
foo: &FOO
<<propname>>:
type: number
default: <<default>>
bar:
- *FOO
propname: "some_prop"
default: "some default"
Context
- YAML 版本 1.2
- user wishes to
- 在 YAML 中包含变量占位符
- 将占位符替换为计算值
yaml.load
- 能够对 YAML 映射键和值使用占位符
Problem
- YAML 本身不支持变量占位符。
- 锚点和别名几乎提供了所需的功能,但它们不能用作可插入到整个 YAML 文本中的任意区域的变量占位符。它们必须放置为单独的 YAML 节点。
- 有一些附加库支持任意变量占位符,但它们不是本机 YAML 规范的一部分。
Example
请考虑以下示例 YAML。它是格式良好的 YAML 语法,但它使用带有嵌入表达式的(非标准)大括号占位符。
嵌入的表达式不会在 YAML 中产生所需的结果,因为它们不是本机 YAML 规范的一部分。尽管如此,本示例中使用它们只是为了帮助说明标准 YAML 可用的内容和不可用的内容。
part01_customer_info:
cust_fname: "Homer"
cust_lname: "Himpson"
cust_motto: "I love donuts!"
cust_email: [email protected] /cdn-cgi/l/email-protection
part01_government_info:
govt_sales_taxrate: 1.15
part01_purchase_info:
prch_unit_label: "Bacon-Wrapped Fancy Glazed Donut"
prch_unit_price: 3.00
prch_unit_quant: 7
prch_product_cost: "{{prch_unit_price * prch_unit_quant}}"
prch_total_cost: "{{prch_product_cost * govt_sales_taxrate}}"
part02_shipping_info:
cust_fname: "{{cust_fname}}"
cust_lname: "{{cust_lname}}"
ship_city: Houston
ship_state: Hexas
part03_email_info:
cust_email: "{{cust_email}}"
mail_subject: Thanks for your DoughNutz order!
mail_notes: |
We want the mail_greeting to have all the expected values
with filled-in placeholders (and not curly-braces).
mail_greeting: |
Greetings {{cust_fname}} {{cust_lname}}!
We love your motto "{{cust_motto}}" and we agree with you!
Your total purchase price is {{prch_total_cost}}
解释
-
下面是一个内联图像,说明了带有绿色、黄色和红色彩色区域的示例。
-
替换标记为GREEN在标准 YAML 中很容易使用,使用锚点、别名和合并键 http://yaml.org/type/merge.html.
-
替换标记为YELLOW在技术上可以在标准 YAML 中使用,但并非没有自定义类型声明 https://duckduckgo.com/?q=yaml+custom+data+types,或其他一些绑定机制。
-
替换标记为RED在标准 YAML 中不可用。然而,还有解决方法和替代方案;比如通过字符串格式化 https://stackoverflow.com/questions/tagged/string-formatting或字符串模板引擎(例如 python 的str.format
).
Details
具有可变占位符的模板是经常请求的 YAML 功能。
通常,开发人员希望交叉引用同一 YAML 文件中的内容或嵌入的 https://stackoverflow.com/tags/include/infoYAML 文件。
YAML 支持锚点和别名,但此功能不支持在 YAML 文本中的任意位置任意放置占位符和表达式。它们仅适用于 YAML 节点。
YAML 还支持自定义类型声明 https://duckduckgo.com/?q=yaml+custom+data+typess,但是这些不太常见,并且如果您接受来自潜在不受信任来源的 YAML 内容,则会存在安全隐患。
YAML 插件库
有 YAML 扩展库,但它们不是本机 YAML 规范的一部分。
- Ansible
- https://docs.ansible.com/ansible-container/container_yml/template.html https://docs.ansible.com/ansible-container/container_yml/template.html
- (支持 YAML 的许多扩展,但它是一个编排工具,如果您只需要 YAML,那就有点过分了)
- https://github.com/kblomqvist/yasha https://github.com/kblomqvist/yasha
- https://bitbucket.org/djarvis/yamlp https://bitbucket.org/djarvis/yamlp
解决方法
- 将 YAML 与模板系统结合使用,例如 Jinja2 或 Twig
- 使用 YAML 扩展库
- Use
sprintf
or str.format
来自宿主语言的样式功能
备择方案
-
YTT YAML 模板 https://developer.ibm.com/blogs/yaml-templating-tool-to-simplify-complex-configuration-management/本质上是 YAML 的一个分支,具有可能更接近 OP 中指定的目标的附加功能。
-
Jsonnet https://jsonnet.org与 YAML 有一些相似之处,但具有可能更接近 OP 中指定的目标的附加功能。
See also
在SO这里
- 配置文件中的 YAML 变量 https://stackoverflow.com/questions/38404633/reading-yaml-config-file-in-python-and-using-variables
- 在 Python 中加载与 Jinja2 嵌套的 YAML https://stackoverflow.com/questions/31967064
- YAML 中的字符串插值 https://stackoverflow.com/questions/15777987/string-interpolation-in-yaml
- 如何从同一 YAML 文件中的其他位置引用 YAML“设置”? https://stackoverflow.com/questions/2063616/how-to-reference-a-yaml-setting-from-elsewhere-in-the-same-yaml-file
- 将 YAML 与变量一起使用 https://stackoverflow.com/questions/4150782/use-yaml-with-variables
- 如何将 YAML 文件包含在另一个文件中? https://stackoverflow.com/questions/528281/how-can-i-include-an-yaml-file-inside-another?rq=1
- 在rails国际化yml文件中传递变量 https://stackoverflow.com/questions/13055753/passing-variables-inside-rails-internationalization-yml-file
- 一个 YAML 对象可以引用另一个吗? https://stackoverflow.com/questions/3141438/can-one-yaml-object-refer-to-another
- 有没有办法用rails引用yaml中的常量? https://stackoverflow.com/questions/7169121/is-there-a-way-to-reference-a-constant-in-a-yaml-with-rails
- 带有嵌套 Jinja 的 YAML https://stackoverflow.com/questions/31967064/load-yaml-nested-with-jinja2-in-python
- YAML 合并键 https://stackoverflow.com/questions/47168718/yaml-merge-level/47203224#47203224
- YAML 合并键 https://stackoverflow.com/a/48196167/42223
外部SO
- https://learnxinyminutes.com/docs/yaml/ https://learnxinyminutes.com/docs/yaml/
- https://github.com/dreftymac/awesome-yaml#variables https://github.com/dreftymac/awesome-yaml#variables
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)