web-dev-qa-db-ja.com

yamlでプレースホルダーを使用する

次のようなyamlでプレースホルダーを使用する方法はありますか?

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

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

状況

  • YAMLバージョン1.2
  • ユーザーが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:   [email protected]

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}}

    Thank you for your order!

説明

  • GREENでマークされた置換は、アンカー、エイリアス、および マージキー を使用して、標準のYAMLですぐに使用できます。

  • YELLOWでマークされた置換は、標準のYAMLで技術的に利用可能ですが、 カスタム型宣言 、またはその他のバインディングメカニズム。

  • REDでマークされた置換は、標準のYAMLでは使用できません。しかし、回避策と代替策があります。 文字列の書式設定 または文字列テンプレートエンジン(pythonのstr.formatなど)など。

Image explaining the different types of variable substitution in YAML

詳細

YAMLで頻繁にリクエストされる機能は、同じ(または transcluded )YAMLファイル内の他のコンテンツに関連する任意の相互参照と式をサポートする任意の変数プレースホルダーを挿入する機能です。

YAMLはアンカーとエイリアスをサポートしますが、この機能はYAMLテキストの任意の場所でのプレースホルダーと式の任意の配置をサポートしません。 YAMLノードでのみ機能します。

YAMLは カスタム型宣言 sもサポートしますが、これらはあまり一般的ではなく、信頼できない可能性のあるソースからYAMLコンテンツを受け入れるとセキュリティに影響します。

YAMLアドオンライブラリ

YAML拡張ライブラリがありますが、これらはネイティブのYAML仕様の一部ではありません。

回避策

  • Jinja2やTwigなどのテンプレートシステムと組み合わせてYAMLを使用する
  • YAML拡張ライブラリを使用する
  • ホスティング言語のsprintfまたはstr.formatスタイルの機能を使用します

こちらもご覧ください

58
dreftymac