【问题标题】:Use placeholders in yaml在 yaml 中使用占位符
【发布时间】:2017-05-28 00:04:05
【问题描述】:

有没有办法像这样在 yaml 中使用占位符:

foo: &FOO
    <<propname>>: 
        type: number 
        default: <<default>>

bar:
    - *FOO 
       propname: "some_prop"
       default: "some default" 

【问题讨论】:

标签: yaml computed-properties indirection template-variables


【解决方案1】:

上下文

  • YAML 1.2 版
  • 用户希望
    • 在 YAML 中包含变量占位符
    • 根据yaml.load 将占位符替换为计算值
    • 能够为 YAML 映射键和值使用占位符

问题

  • YAML 本身不支持变量占位符。
  • 锚点和别名几乎提供了所需的功能,但它们不能作为可插入到整个 YAML 文本中的任意区域的变量占位符。它们必须作为单独的 YAML 节点放置。
  • 有一些附加库支持任意变量占位符,但它们不是本机 YAML 规范的一部分。

示例

考虑以下示例 YAML。它是格式良好的 YAML 语法,但它使用(非标准)花括号占位符和嵌入式表达式。

嵌入的表达式不会在 YAML 中产生所需的结果,因为它们不是本机 YAML 规范的一部分。不过,在此示例中使用它们只是为了帮助说明标准 YAML 中哪些可用,哪些不可用。

part01_customer_info:
  cust_fname:   "Homer"
  cust_lname:   "Himpson"
  cust_motto:   "I love donuts!"
  cust_email:   homer@himpson.org

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 中很容易使用,使用锚点、别名和 merge keys

  • YELLOW 中标记的替换在技术上可以在标准 YAML 中使用,但不能没有 custom type declaration 或其他一些绑定机制。

  • RED 中标记的替换在标准 YAML 中不可用。然而,有一些变通方法和替代方案;比如通过string formatting或者字符串模板引擎(比如python的str.format)。

详情

YAML 的一个经常请求的功能是能够插入任意变量占位符,这些占位符支持任意交叉引用和与同一(或transcluded)YAML 文件中的其他内容相关的表达式。

YAML 支持锚点和别名,但此功能不支持在 YAML 文本中任意位置放置占位符和表达式。它们仅适用于 YAML 节点。

YAML 也支持 custom type declarations,但这些不太常见,如果您接受来自潜在不受信任来源的 YAML 内容,则会存在安全隐患。

YAML 插件库

有 YAML 扩展库,但这些不是本机 YAML 规范的一部分。

解决方法

  • 将 YAML 与模板系统(例如 Jinja2 或 Twig)结合使用
  • 使用 YAML 扩展库
  • 使用托管语言中的 sprintfstr.format 样式功能

替代方案

  • YTT YAML Templating 本质上是 YAML 的一个分支,具有可能更接近 OP 中指定的目标的附加功能。
  • Jsonnet 与 YAML 有一些相似之处,但有可能更接近 OP 中指定的目标。

另见

在这里

SO 外

【讨论】:

  • 很好的答案,非常详细和解释,谢谢!不幸的是,标记为绿色的那些 Jekyll 用户无法使用,至少在 Jekyll v3.8.5 上无法使用。我测试了自己。
  • 适用于 Jekyll 的是 &amp;hello(别名)和 *hello(锚点),如下所述:idratherbewriting.com/documentation-theme-jekyll/…
【解决方案2】:

使用Yglu Structural Templating,你的例子可以写成:

foo: !()
  !? $.propname: 
     type: number 
     default: !? $.default

bar:
  !apply .foo: 
    propname: "some_prop"
    default: "some default"

免责声明:我是作者或Yglu。

【讨论】:

    【解决方案3】:

    我想https://get-ytt.io/ 可以解决您的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2013-10-16
      • 2015-09-05
      • 2012-07-08
      • 2013-06-08
      • 2017-04-28
      • 1970-01-01
      相关资源
      最近更新 更多