Değişkenlerle YAML kullanın


82

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: defaultdiğer ayarlarda nasıl kullanılabilir? Sözdizimi nedir?


Bu YAML'yi ayrıştırmak için hangi dili / kitaplığı kullanıyorsunuz? YAML'de bunu yapmanın standart bir yolu yoktur, ancak kitaplığınızın bazı hileleri olabilir.
Jesse Beder


@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 ;; yakından ilişkili, ancak kopya değil. Rasgele değişkenler standart YAML'de desteklenmez, ancak YAML ayrıştırma ağacındaki tüm öğelere çapraz referanslar mevcuttur. Bu nedenle sorular biraz farklıdır.
dreftymac


Yanıtlar:


107

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):

Bir değer tanımlayın ve daha sonra bunun tam bir kopyasını kullanın:

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

Bir nesneyi tanımlayın ve daha sonra değişikliklerle birlikte kullanın:

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


1
Ayrıca, bu soru aslında bir kopya: stackoverflow.com/questions/2063616/…
benrugg

1
Ne yapar <<? Belgelerde bulamıyorum .
Hi-Angel

1
@ Hi-Angel YAML Merge Key Specification ne yapar sorusuna cevap verir <<?
dreftymac

46

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 !

1
Harika bul; güzel olan şey, birden çok değişken de yapabilmeniz:% {var1: 'her neyse', var2: 'başka biri'}.
jschorr

2
%Ruby string operatörü hakkında daha fazla bilgi edinin : ruby-doc.org/core-2.2.3/String.html#method-i-25
Trantor Liu

Başka bir yol da size ruby'de bir hash verecek olan yaml'ı yüklemektir. Hash üzerinde değişiklikler yapılabilir ve ardından dosyaya geri yazılabilir.
leoOrion

Harika şeyler. ReactJS + Webpack + messageformat-loader + react-message-context + YAML çözümü ile de çalışır. Değişkeni prop olarak kullanmak aslında kutudan çıktı: <Message id = {'textId'} foo = {'some text'} />
Arkadiusz Lendzian

3

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

1

İ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}"

0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.