YAML ファイル内の変数は可能ですか? 例えば:
theme:
name: default
css_path: compiled/themes/$theme.name
layout_path: themes/$theme.name
この例ではtheme: name: default
、他の設定でどのように使用できますか? 構文は何ですか?
YAML ファイル内の変数は可能ですか? 例えば:
theme:
name: default
css_path: compiled/themes/$theme.name
layout_path: themes/$theme.name
この例ではtheme: name: default
、他の設定でどのように使用できますか? 構文は何ですか?
これは古い投稿ですが、同様のニーズがあり、これが私が思いついた解決策です。これは少しハックですが、機能し、改良することができます。
require 'erb'
require 'yaml'
doc = <<-EOF
theme:
name: default
css_path: compiled/themes/<%= data['theme']['name'] %>
layout_path: themes/<%= data['theme']['name'] %>
image_path: <%= data['theme']['css_path'] %>/images
recursive_path: <%= data['theme']['image_path'] %>/plus/one/more
EOF
data = YAML::load("---" + doc)
template = ERB.new(data.to_yaml);
str = template.result(binding)
while /<%=.*%>/.match(str) != nil
str = ERB.new(str).result(binding)
end
puts str
大きな欠点は、存在する場合と存在しない場合がある変数名 (この場合は「データ」) が yaml ドキュメントに組み込まれることです。おそらく、より良い解決策は $ を使用し、ERB の前に Ruby の変数名に置き換えることです。また、 data.theme.name 型表記を可能にする hashes2ostruct を使用してテストしたところ、目にははるかに簡単です。必要なのは、YAML::load をこれでラップすることだけです
data = hashes2ostruct(YAML::load("---" + doc))
次に、YAML ドキュメントは次のようになります。
doc = <<-EOF
theme:
name: default
css_path: compiled/themes/<%= data.theme.name %>
layout_path: themes/<%= data.theme.name %>
image_path: <%= data.theme.css_path %>/images
recursive_path: <%= data.theme.image_path %>/plus/one/more
EOF