[解決済み] yaml でプレースホルダーを使用する
質問
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 仕様の一部ではありません。
-
アンシブル
- https://docs.ansible.com/ansible-container/container_yml/template.html
- (YAMLの多くの拡張をサポートしていますが、オーケストレーションツールであり、YAMLが欲しいだけならオーバーキルです)
- https://github.com/kblomqvist/yasha
- https://bitbucket.org/djarvis/yamlp
ワークアラウンド
- Jinja2やTwigのようなテンプレートシステムと組み合わせてYAMLを使用する。
- YAML拡張ライブラリを使用する
-
使用方法
sprintf
またはstr.format
ホスト言語からのスタイル機能
代替品
- YTT YAML Templating は、基本的にYAMLのフォークで、OPで指定された目標に近い追加機能があるかもしれません。
- Jsonnet はYAMLと類似していますが、OPで指定された目標に近いかもしれない追加機能があります。
こちらもご覧ください
SOはこちら
- 設定ファイル内のYAML変数
- PythonでJinja2とネストしたYAMLを読み込む
- YAMLにおける文字列の補間
- 同じYAMLファイル内の他の場所からYAML "setting"を参照する方法は?
- YAMLを変数で使用する
- YAML ファイルを別のファイルの中に含めるにはどうしたらいいですか?
- railsの国際化ymlファイル内で変数を渡す
- ある YAML オブジェクトが別のオブジェクトを参照することはできますか?
- railsでyamlの定数を参照する方法はありますか?
- ネストされたJinjaのあるYAML
- YAML マージキー
- YAML マージキー
外部SO
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン