つまり、次のようなことができるのです:
sitelist: &sites
- www.foo.com
- www.bar.com
anotherlist: *sites
そして、とにはsitelist
、とがanotherlist
含まれています。しかし、私が本当に望んでいるのは、www.foo.com
www.bar.com
anotherlist
またと をwww.baz.com
繰り返さずに を含めることができます。www.foo.com
www.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 回しか指定できません。次に、シーケンスを値として使用する場合、順序が重要になります。この例では関連する値がないため、これは問題になりませんが、知っておく価値はあります。