YAML には継承があります。私が今まで見た中で最も明確な例はここにあります: http://blog.101ideas.cz/posts/dry-your-yaml-files.html
もっと複雑なものが必要です。オブジェクトのオブジェクトのプロパティをオーバーライドする必要があります。次に例を示します。
database: &default
server:
ip: 192.168.1.5
port: 2000
db_name: test
user:
name: root
password: root
# database foo differs from default by only its port and user password
foo_database:
<<: *default
server:
port: 2001
db_name: foo
user:
password: foo_root
私はこの結果を得たい:
foo_database.server.ip -> 192.168.1.5
foo_database.server.port -> 2001
foo_database.db_name -> foo
foo_database.user.name -> root
foo_database.user.password -> foo_root
しかし、このように宣言すると、これらのプロパティが正しくなくなります (期待値によると)。
foo_database.server.ip -> will be None
foo_database.user.name -> will be None
新しい「サーバー」オブジェクトには「ポート」プロパティしかなく、古い「サーバー」オブジェクト全体をオーバーライドするためです。
達成したい種類の継承を取得するにはどうすればよいですか?
編集
LiveScriptで動作するコードを使用した私の正確な意図は次のとおりです。
config =
default:
ip: \192.168.1.5
port: 2000
name: \root
password: \root
db:
name: \default
location: \LA
foo-database:~ -> @default `merge` do
ip: \11.11.11.11
db:
name: \my-foo
bar-database:~ -> @foo-database `merge` do
password: \1234
db:
location: \SF
config.default
# => {"ip":"192.168.1.5","port":2000,"name":"root","password":"root","db":{"name":"default","location":"LA"}}
config.foo-database
# => {"ip":"11.11.11.11","port":2000,"name":"root","password":"root","db":{"name":"my-foo","location":"LA"}}
config.bar-database
# => {"ip":"11.11.11.11","port":2000,"name":"root","password":"1234","db":{"name":"my-foo","location":"SF"}}