1. ホーム
  2. yaml

[解決済み] yaml でプレースホルダーを使用する

2022-03-12 06:46:02

質問

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

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

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

解決方法は?

コンテキスト

  • 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:   [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}}
    

説明

  • 以下は、緑、黄、赤の色つき領域で例を示したインライン画像です。

  • でマークされた置換は グリーン は標準的なYAMLで、アンカー、エイリアス、そして マージキー .

  • でマークされた置換は 黄色 は、技術的には標準的なYAMLで利用可能ですが カスタムタイプ宣言 またはその他のバインドメカニズムを使用します。

  • でマークされた置換は RED は標準的な YAML では利用できません。しかし、回避策と代替手段があります; たとえば 文字列フォーマット や文字列テンプレートエンジン(pythonの str.format ).

詳細

YAML に対して頻繁にリクエストされる機能は、任意の相互参照と他のコンテンツに関連する表現をサポートする任意の変数プレースホルダーを挿入する機能です。 トランスクルード YAMLファイル(複数可)。

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

また、YAMLは カスタムタイプ宣言 しかし、これらはあまり一般的ではなく、信頼できない可能性のあるソースからYAMLコンテンツを受け入れる場合、セキュリティ上の影響があります。

YAMLアドオンライブラリ

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

ワークアラウンド

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

代替品

  • YTT YAML Templating は、基本的にYAMLのフォークで、OPで指定された目標に近い追加機能があるかもしれません。
  • Jsonnet はYAMLと類似していますが、OPで指定された目標に近いかもしれない追加機能があります。

こちらもご覧ください

SOはこちら

外部SO