변수와 함께 YAML 사용


82

YAML 파일 내의 변수가 가능합니까? 예를 들면 :

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

이 예 theme: name: default에서 다른 설정에서 어떻게 사용할 수 있습니까? 구문은 무엇입니까?


이 YAML을 구문 분석하기 위해 어떤 언어 / 라이브러리를 사용하고 있습니까? YAML에서이 작업을 수행하는 표준 방법은 없지만 라이브러리에 몇 가지 트릭이있을 수 있습니다.
Jesse Beder


@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 ;; 밀접하게 관련되어 있지만 중복은 아닙니다. 표준 YAML에서는 임의 변수가 지원되지 않지만 YAML 구문 분석 트리의 전체 요소에 대한 상호 참조를 사용할 수 있습니다. 따라서 질문이 약간 다릅니다.
dreftymac


답변:


106

저도 같은 질문을했는데, 많은 조사 끝에 불가능한 것 같습니다 .

cgat의 대답은 올바른 방향이지만 실제로 이와 같은 참조를 연결할 수는 없습니다.

다음은 YAML에서 "변수"로 수행 할 수있는 작업입니다 (이를 설정하면 공식적으로 "노드 앵커"라고하고 나중에 사용할 때는 "참조"라고 함).

값을 정의하고 나중에 정확한 사본을 사용하십시오.

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#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

https://gist.github.com/bowsersenior/979804 의 훌륭한 데모에서 직접 가져 왔습니다.


1
또한이 질문은 기본적으로 중복됩니다. stackoverflow.com/questions/2063616/…
benrugg

1
무엇을 <<합니까? 문서 에서 찾을 수없는 것 같습니다 .
Hi-Angel

1
@ Hi-Angel 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이 주석에서 말했듯이 Yaml 파일의 값에 여러 변수를 추가 할 수도 있습니다.

Yaml :

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 : 'whatever', var2 : 'anotherone'}.
jschorr

2
[정보 자세히보기 %루비 문자열의 운영자 : ruby-doc.org/core-2.2.3/String.html#method-i-25
Trantor 리우

또 다른 방법은 yaml을로드하는 것입니다. 그러면 루비에서 해시를 얻을 수 있습니다. 해시를 변경 한 다음 파일에 다시 쓸 수 있습니다.
leoOrion

좋은 물건. ReactJS + Webpack + messageformat-loader + react-message-context + 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 이전에 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

0

Rails / ruby ​​프레임 워크는 템플릿 화를 할 수 있습니다 ... 환경 변수를로드하는 데 자주 사용됩니다 ...

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

YML 형식이 json의 상위 집합이라고 생각하므로 이것이 자바 스크립트 프레임 워크에서 작동하는지 알 수 없으며 yml 파일을 읽는 것에 따라 다릅니다.

당신은 등 템플릿 사용할 수있는 경우 << >>또는 {{ }}당신이 그 직후에 당신의 독자에 따라 스타일을 ...

다른 yml 파일에서 ...

# boo.yml

development:
  fooz: foo

기본적으로 동적으로 설정 될 때마다 원본 파일을 참조로 변수를 삽입 할 수 있습니다. 읽을 때 나는 또한 여러 언어에 대한 객체로 YML 파일을 즉시 생성하거나 열 수 있다는 것을 보았습니다. 파일을 만들고 일련의 YML 파일을 작성하거나 동적으로 생성 된 파일을 모두 정적으로 가리 키도록 할 수 있습니다.


0

요구 사항이 여러 변수를 대체하는 구문 분석과 같은 경우 해시 / 또는 다른 것으로 사용하면 다음과 같이 할 수 있습니다

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 안에 다음과 같은 변수를 넣으십시오.

"%{var_a}"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.