97

YAML ファイル内の変数は可能ですか? 例えば:

theme:
  name: default
  css_path: compiled/themes/$theme.name
  layout_path: themes/$theme.name

この例ではtheme: name: default、他の設定でどのように使用できますか? 構文は何ですか?

4

6 に答える 6

4

これは古い投稿ですが、同様のニーズがあり、これが私が思いついた解決策です。これは少しハックですが、機能し、改良することができます。

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
于 2011-08-29T20:24:15.540 に答える