YAML dosyalarındaki değişkenler mümkün mü? Örneğin:
theme:
name: default
css_path: compiled/themes/$theme.name
layout_path: themes/$theme.name
Bu örnekte, theme: name: default
diğer ayarlarda nasıl kullanılabilir? Sözdizimi nedir?
YAML dosyalarındaki değişkenler mümkün mü? Örneğin:
theme:
name: default
css_path: compiled/themes/$theme.name
layout_path: themes/$theme.name
Bu örnekte, theme: name: default
diğer ayarlarda nasıl kullanılabilir? Sözdizimi nedir?
Yanıtlar:
Ben de aynı soruyu sormuştum ve birçok araştırmadan sonra bu mümkün değil gibi görünüyor .
Cgat'ın cevabı doğru yoldadır, ancak aslında bu şekilde referansları birleştiremezsiniz.
YAML'deki "değişkenler" ile yapabileceğiniz şeyler (bunlar, onları ayarladığınızda resmi olarak "düğüm bağlantıları" ve daha sonra kullandığınızda "referanslar" olarak adlandırılır):
default: &default_title This Post Has No Title
title: *default_title
{veya}
example_post: &example
title: My mom likes roosters
body: Seriously, she does. And I don't know when it started.
date: 8/18/2012
first_post: *example
second_post:
title: whatever, etc.
Daha fazla bilgi için, wiki sayfasının YAML hakkındaki şu bölümüne bakın: http://en.wikipedia.org/wiki/YAML#References
default: &DEFAULT
URL: stooges.com
throw_pies?: true
stooges: &stooge_list
larry: first_stooge
moe: second_stooge
curly: third_stooge
development:
<<: *DEFAULT
URL: stooges.local
stooges:
shemp: fourth_stooge
test:
<<: *DEFAULT
URL: test.stooges.qa
stooges:
<<: *stooge_list
shemp: fourth_stooge
Bu, doğrudan buradaki harika bir demodan alınmıştır: https://gist.github.com/bowsersenior/979804
<<
? Belgelerde bulamıyorum .
<<
?
Biraz aramadan sonra, %
operatörü kullanan daha temiz bir çözüm buldum .
YAML dosyanızda:
key : 'This is the foobar var : %{foobar}'
Yakut kodunuzda:
require 'yaml'
file = YAML.load_file('your_file.yml')
foobar = 'Hello World !'
content = file['key']
modified_content = content % { :foobar => foobar }
puts modified_content
Ve çıktı:
This is the foobar var : Hello World !
@Jschorr'un yorumda söylediği gibi, Yaml dosyasındaki değere birden çok değişken de ekleyebilirsiniz:
Yaml:
key : 'The foo var is %{foo} and the bar var is %{bar} !'
Yakut:
# ...
foo = 'FOO'
bar = 'BAR'
# ...
modified_content = content % { :foo => foo, :bar => bar }
Çıktı :
The foo var is FOO and the bar var is BAR !
%
Ruby string operatörü hakkında daha fazla bilgi edinin : ruby-doc.org/core-2.2.3/String.html#method-i-25
Bu eski bir gönderi, ama benzer bir ihtiyacım vardı ve bulduğum çözüm bu. Biraz hile, ama işe yarıyor ve iyileştirilebilir.
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
Büyük bir dezavantajı, yaml belgesine var olabilecek veya olmayabilecek bir değişken adı (bu durumda "veri") yerleştirmesidir. Belki daha iyi bir çözüm, $ kullanmak ve bunu ERB'den önce Ruby'deki değişken adı ile değiştirmek olabilir. Ayrıca, sadece kullanılarak test hashes2ostruct gözleri çok daha kolaydır data.theme.name tip gösterimini verir. Gereken tek şey YAML :: yükünü bununla sarmaktır.
data = hashes2ostruct(YAML::load("---" + doc))
O zaman YAML belgeniz şöyle görünebilir
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
İhtiyacınız birden çok değişkeni değiştirmeyi ayrıştırmaksa ve bunu bir karma / veya herhangi bir şey olarak kullanmaksa, bunun gibi bir şey yapabilirsiniz.
require 'yaml'
require 'json'
yaml = YAML.load_file("xxxx.yaml")
blueprint = yaml.to_json % { var_a: "xxxx", var_b: "xxxx"}
hash = JSON.parse(blueprint)
yaml'ın içine sadece bunun gibi değişkenler koyun
"%{var_a}"
Raylar / ruby çerçeveleri bazı şablonlar yapabilir ... genellikle env değişkenlerini yüklemek için kullanılır ...
# fooz.yml
foo:
bar: <%= $ENV[:some_var] %>
Bunun javascript çerçeveleri için işe yarayıp yaramadığına dair hiçbir fikrim yok, çünkü YML biçiminin json'un üst kümesi olduğunu ve sizin için yml dosyasını neyin okuduğuna bağlı olduğunu düşünüyorum.
Okuyucunuza bağlı olarak şablonu << >>
veya {{ }}
stilleri veya stilleri kullanabilirseniz, ondan sonra sadece ...
Başka bir yml dosyasında ...
# boo.yml
development:
fooz: foo
Bu, dinamik olarak ayarlanan her seferinde orijinal dosyaya referans olarak bir değişken eklemenizi sağlar. Okurken, bir dosya oluşturmanıza ve bir dizi YML dosyası yazmanıza veya yalnızca statik olarak dinamik olarak oluşturulmuş olana işaret etmenize olanak tanıyan çeşitli diller için YML dosyalarını anında nesneler olarak oluşturabileceğinizi veya açabileceğinizi görüyordum.