在 YAML 中使用占位符

2024-05-15

有没有办法在 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(使用前将#替换为@)

在 YAML 中使用占位符 的相关文章

  • yaml / yaml 多行转义序列中的 Markdown?

    是否可以在 yaml 中存储未转义的 Markdown 文档 我测试过 key markdown text block that could have any combination of line breaks gt etc etc 这是
  • Firefox Placeholder Before CSS 选择器不起作用

    我使用的是最新的firefox 30 0 我正在尝试在必填字段的占位符之前插入红色字体真棒星号 我在 Chrome 中工作没问题 但我在 FF 和 上遇到问题 这是一个说明我的问题的代码笔 http codepen io anon pen
  • Spring Boot - YML 配置 - 合并时擦除条目

    我的应用程序有一个基本 YML 配置 在类路径中如下所示 hello world values bar name bar name description bar description foo name foo name descript
  • 如何在 YAML 中阻止注释?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 如何在 YAML 中注释一行行 YAML 支持内联注释 但不支持块注释 From 维基百
  • 如何使用显式引用转储 YAML?

    递归引用非常适合ruamel yaml or pyyaml ruamel yaml dump ruamel yaml load A A id001 id001 然而 它 显然 不适用于普通引用 ruamel yaml dump ruamel
  • Java - 文本字段上的占位符

    我正在尝试使用 Swing 创建一个 GUI 我的问题是 我有一个文本字段 但我希望它有一个 占位符 就像在 html 中一样 我在这里和那里读到它可以通过覆盖文本字段的paint 来完成 由于我的代码已生成 我发现我需要使用 自定义创建代
  • 如何将参数传递给 Symfony2 中的验证约束 - 在 yml 中

    我正在尝试向我的应用程序添加一个包范围的参数 以便我可以将其添加到我的验证约束文件 validation yml 中 myApp myBundle Entity Contact properties name NotBlank messag
  • 我可以重载模板变量吗?

    我想声明这样的事情 template
  • YAML 每个缩进有多少个空格?

    如果我在每个缩进级别使用一个空格 两个或四个空格 有什么区别吗 YAML 每个结构类型的空间数量有什么具体规则吗 例如4嵌套空间maps 1每空间项目清单 etc 我正在为 elastic beanstalk ebextensions 编写
  • 前面的冒号:YAML 语法

    我目前在项目中使用 Sidekiq 并且有以下 YAML 配置文件 concurrency 5 pidfile tmp pids sidekiq pid logfile log sidekiq log staging concurrency
  • 将占位符文本添加到文本框

    我正在寻找一种将占位符文本添加到文本框的方法 就像在 html5 中使用文本框一样 IE 如果文本框没有文本 则会添加文本Enter some text here 当用户单击它时 占位符文本消失并允许用户输入自己的文本 如果文本框失去焦点并
  • 如何在占位符中动态生成的标签之间创建换行符?

    这是文件后面代码中的以下代码Page Load event LinkButton linkButton new LinkButton linkButton ID LinkButtonDynamicInPlaceHolder1Id i lin
  • BigDecimal 无法强制转换为 BigDecimal

    这应该很简单 但它却爆炸了 有任何想法吗 d BigDecimal new 2 0 YAML load a gt d to yaml TypeError BigDecimal can t be coerced into BigDecimal
  • 无需别名的 Ruby YAML 编写

    我正在从 ruby 将数据写入 yaml 文件 并且经常在该文件上添加别名 像 id001 somekey somevalue id001 就我而言 我使用 yaml 文件来aid可读性并将名称添加到文件中的值 因为现有数据只是 没有键的分
  • Python 中的 JSON 到 YAML:如何获得正确的字符串操作?

    我正在使用PyYAML 库 https github com yaml pyyaml将 json 转换为 yaml 但是引号在不应该的情况下从字符串值中删除了 它们只能从钥匙上移除 我已将 default flow style 选项与 ya
  • 使用 YAML.load 解析 json 安全吗?

    我使用的是红宝石2 1 0 我有一个 json 文件 例如 测试 json item apple 1 banana 2 使用 YAML load 加载此文件是否安全 YAML load File read test json 我正在尝试加载
  • 如何将对象数组定义为参数?

    我很新Swagger 所以这可能是一个基本问题 我可以为采用整数数组作为参数的 API 创建 yml 文件 如下所示 Add samples tags MY API parameters name my id in path type in
  • Perl YAML 模块无法识别标量类型

    我加载以下 yaml 文件 foo bar s 1 hx 0x34 用这段代码 use YAML qw LoadFile Dump use Data Dumper my d LoadFile test yaml print Dumper d
  • 如何将字典和列表安全转储到 YAML 中?

    我想要输出为下面的 YAML item Food eat Food itemId 42536216 category fruit moreInfo organic 我已使用以下代码按照与上面相同的顺序进行打印 但输出未按预期进行 Code
  • 使用 VSCode 对某些 YAML 字段进行自定义语法突出显示

    我们的基础设施使用 YML 文件来配置各种流程 例如 非常简化的 配置块可能如下所示 process my process requires other process parameter dockerfile FROM alpine RU

随机推荐