चर के साथ YAML का उपयोग करें


82

क्या YAML फ़ाइलों के भीतर चर संभव हैं? उदाहरण के लिए:

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

इस उदाहरण में, theme: name: defaultअन्य सेटिंग्स में कैसे उपयोग किया जा सकता है? वाक्य रचना क्या है?


इस YAML को पार्स करने के लिए आप किस भाषा / पुस्तकालय का उपयोग कर रहे हैं? YAML में ऐसा करने का कोई मानक तरीका नहीं है, लेकिन हो सकता है कि आपकी लाइब्रेरी में कुछ ट्रिक्स हों।
जेसी बेडर

1
के संभावित डुप्लिकेट: stackoverflow.com/questions/2063616/…
Ciro Santilli 郝海东 over over over over

@CiroSantilli 巴拿馬 文件 事件 法轮功; ;; बारीकी से संबंधित है, लेकिन एक डुप्लिकेट नहीं। मनमाने ढंग से चर मानक YAML में समर्थित नहीं हैं, हालांकि YAML पार्स पेड़ से पूरे तत्वों के लिए क्रॉस-संदर्भ उपलब्ध हैं। इसलिए सवाल थोड़े अलग हैं।
dreftymac

इन्हें भी देखें: stackoverflow.com/questions/15777987/…
dreftymac

इन्हें भी देखें: stackoverflow.com/a/41620747/42223
dreftymac

जवाबों:


107

मेरे पास यही सवाल था, और बहुत शोध के बाद, ऐसा लगता है कि यह संभव नहीं है

Cgat का उत्तर सही रास्ते पर है, लेकिन आप वास्तव में उस तरह के संदर्भों को संक्षिप्त नहीं कर सकते।

यमर्ल में आप "वैरिएबल्स" के साथ कर सकते हैं, जिन्हें आप बाद में सेट करते समय उन्हें "रेफर एंकर्स" कहते हैं और जब आप उन्हें इस्तेमाल करते हैं तो "रेफरेंस" कहते हैं:

एक मान को परिभाषित करें और बाद में इसकी एक सटीक प्रति का उपयोग करें:

default: &default_title This Post Has No Title
title: *default_title

{या}

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.

अधिक जानकारी के लिए, YAML के बारे में विकी पृष्ठ के इस भाग को देखें: http://en.wikipedia.org/wiki/YAML##eferences

एक वस्तु को परिभाषित करें और बाद में संशोधनों के साथ इसका उपयोग करें:

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

यह सीधे यहां एक महान डेमो से लिया गया है: https://gist.github.com/bowsersenior/979804


1
इसके अलावा, यह सवाल अनिवार्य रूप से एक डुप्लिकेट है: stackoverflow.com/questions/2063616/…
benrugg

1
क्या करता <<है? मैं इसे दस्तावेज में नहीं ढूंढ सकता ।
हाय-एंजेल

1
@ हाय-एंजेल YAML मर्ज की स्पेसिफिकेशन्स इस सवाल का जवाब देती है कि क्या करता <<है?
dreftymac

46

कुछ खोज के बाद, मुझे एक क्लीनर समाधान मिला है जो %ऑपरेटर का उपयोग करता है।

आपकी YAML फाइल में:

key : 'This is the foobar var : %{foobar}'

अपने रूबी कोड में:

require 'yaml'

file = YAML.load_file('your_file.yml')

foobar = 'Hello World !'
content = file['key']
modified_content = content % { :foobar => foobar }

puts modified_content

और आउटपुट है:

This is the foobar var : Hello World !

जैसा कि @jschorr ने टिप्पणी में कहा है, आप यमल फ़ाइल में मान में कई चर जोड़ सकते हैं:

यमल:

key : 'The foo var is %{foo} and the bar var is %{bar} !'

माणिक :

# ...
foo = 'FOO'
bar = 'BAR'
# ...
modified_content = content % { :foo => foo, :bar => bar }

आउटपुट:

The foo var is FOO and the bar var is BAR !

1
शानदार खोज; अच्छी बात यह है कि आप कई चर भी कर सकते हैं:% {var1: 'जो भी हो, var2:' एक और '}।
19

2
%रूबी स्ट्रिंग के संचालक के बारे में अधिक पढ़ें : ruby-doc.org/core-2.2.3/String.html#method-i-25
लियू

एक और तरीका है यम को लोड करना, जो आपको रूबी में एक हैश देगा। हैश में परिवर्तन किया जा सकता है और फिर फ़ाइल में वापस लिखा जा सकता है।
leoOrion

उत्तम सामग्री। ReactJS + Webpack + messageformat-loader + प्रतिक्रिया-संदेश-संदर्भ + YAML समाधान के साथ भी काम करता है। यह वास्तव में परिवर्तनशील बॉक्स को प्रोप के रूप में उपयोग करने के लिए बॉक्स से बाहर काम करता है: <Message id = {'textId'} foo = {'some text'} />
Arkadiusz Lendzian

3

यह एक पुरानी पोस्ट है, लेकिन मुझे इसी तरह की आवश्यकता थी और यह वह समाधान है जिसके साथ मैं आया था। यह थोड़ा हैक है, लेकिन यह काम करता है और इसे परिष्कृत किया जा सकता है।

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 से पहले रूबी में चर नाम के साथ स्थानापन्न करना होगा। इसके अलावा, बस hashes2ostruct का उपयोग करके परीक्षण किया गया है जो data.theme.name प्रकार संकेतन की अनुमति देता है जो आंखों पर बहुत आसान है। सभी आवश्यक है कि YAML को लपेटें :: इस के साथ लोड करें

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

1

यदि आपकी आवश्यकता कई चर को बदलने की तरह है और फिर इसे हैश / या कुछ के रूप में उपयोग करें तो आप कुछ इस तरह से कर सकते हैं

require 'yaml'
require 'json'
yaml = YAML.load_file("xxxx.yaml")
blueprint = yaml.to_json % { var_a: "xxxx", var_b: "xxxx"}
hash = JSON.parse(blueprint)

यम के अंदर बस इस तरह चर डाल दिया

"%{var_a}"

0

रेल / रूबी ढांचे कुछ टेम्प्लेटिंग करने में सक्षम हैं ... इसका उपयोग अक्सर एनवी चर को लोड करने के लिए किया जाता है ...

# fooz.yml
  foo:
    bar: <%= $ENV[:some_var] %>

कोई विचार नहीं है अगर यह जावास्क्रिप्ट चौखटे के लिए काम करता है जैसा कि मुझे लगता है कि YML प्रारूप जोंस का सुपरसेट है और यह इस बात पर निर्भर करता है कि आपके लिए yml फ़ाइल क्या पढ़ती है।

यदि आप अपने पाठक के आधार पर उस तरह या << >>या {{ }}शैलियों का उपयोग कर सकते हैं , उसके बाद आप बस ...

एक और yml फ़ाइल में ...

# boo.yml

development:
  fooz: foo

जो आपको मूल रूप से आपके संदर्भ के रूप में एक चर डालने की अनुमति देता है जो मूल फ़ाइल हर बार गतिशील रूप से सेट होती है। पढ़ते समय मैं यह भी देख रहा था कि आप कई भाषाओं के लिए फ्लाई पर ऑब्जेक्ट्स के रूप में वाईएमएल फाइल बना या खोल सकते हैं, जो आपको वाईएमएल फाइलों की एक श्रृंखला लिखने के लिए फाइल या चेन बनाने की अनुमति देती है या बस उन सभी को गतिशील रूप से बनाए गए एक की ओर इशारा करते हुए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.