リストやマップの一部を共有するための YAML 構文はありますか? 質問する

リストやマップの一部を共有するための YAML 構文はありますか? 質問する

つまり、次のようなことができるのです:

sitelist: &sites
  - www.foo.com
  - www.bar.com

anotherlist: *sites

そして、とにはsitelist、とがanotherlist含まれています。しかし、私が本当に望んでいるのは、www.foo.comwww.bar.comanotherlistまたと をwww.baz.com繰り返さずに を含めることができます。www.foo.comwww.baz.com

これを行うと、YAML パーサーで構文エラーが発生します。

sitelist: &sites
  - www.foo.com
  - www.bar.com

anotherlist: *sites
  - www.baz.com

アンカーとエイリアスを使用するだけでは、次のような別のレベルのサブ構造を追加せずに、必要なことを行うことはできないようです。

sitelist: &sites
  - www.foo.com
  - www.bar.com

anotherlist:
  - *sites
  - www.baz.com

つまり、この YAML ファイルの消費者はそれを認識している必要があります。

このようなことを純粋な YAML で行う方法はありますか? それとも、変数の置換や特定の種類のサブ構造の自動リフトなどの YAML 後処理を使用する必要がありますか? 私はすでに他のいくつかのユースケースを処理するためにそのような後処理を行っているので、まったく嫌悪感はありません。ただし、私の YAML ファイルは機械生成ではなく人間によって作成されるため、標準の YAML 構文に加えて、ユーザーが覚えておく必要のあるルールの数を最小限に抑えたいと思います。

地図でも同様のことができるようにしたいと思います。

namedsites: &sites
  Foo: www.foo.com
  Bar: www.bar.com

moresites: *sites
  Baz: www.baz.com

私は検索しましたYAML仕様、何も見つけられなかったので、答えは「いいえ、これはできません」ということだと思います。でも、もし誰かが何かアイデアを持っているなら、それは素晴らしいことです。


編集:回答がないので、YAML 仕様で私が見つけていないことは誰も見つけておらず、これは YAML レイヤーでは実行できないと推測しています。そのため、将来誰かがこの質問を見つけた場合に備えて、YAML を後処理してこの問題を解決するためのアイデアについて質問を公開しています。

ベストアンサー1

マージキータイプおそらく、これが必要なことでしょう。特別な<<マッピング キーを使用してマージを示し、マッピングへのエイリアス (またはそのようなエイリアスのシーケンス) を初期化子として使用して、単一のマッピングにマージできるようにします。さらに、値を明示的にオーバーライドしたり、マージ リストに存在しない値を追加したりすることもできます。

最初の例のように、シーケンスではなくマッピングで機能することに注意してください。これはよく考えてみると理にかなっていますし、あなたの例では、いずれにしてもシーケンシャルである必要はないようです。次の (テストされていない) 例のように、シーケンス値をマッピング キーに変更するだけで、うまくいくはずです。

sitelist: &sites
  ? www.foo.com  # "www.foo.com" is the key, the value is null
  ? www.bar.com

anotherlist:
  << : *sites    # merge *sites into this mapping
  ? www.baz.com  # add extra stuff

注意すべき点がいくつかあります。まず、<<はキーなので、ノードごとに 1 回しか指定できません。次に、シーケンスを値として使用する場合、順序が重要になります。この例では関連する値がないため、これは問題になりませんが、知っておく価値はあります。

おすすめ記事