yaml conf 파일의 해시를 병합

2009년 7월 31일로 prashant
아래 출원 : 기술

YAML 꽤 구성 파일을 작성하기위한 편리합니다. 기본 장점은 그것이 텍스트 파일처럼 읽고있다. 당신의 구성 파일은 평면 (아무 계층)과없는 반복을 가지고있다면 이것은 진짜로 잘 작동합니다.
당신의 구성 파일이 있으면 그때가 이러한 요소를 분리하고 그들을 재사 용할 말이 반복 있습니다. 내 말은 이것이다 - 당신은 당신의 설정 파일이이 모양 말을 보자 :

  개발 :
   input_location : common_input
   output_location : dev_location
   메일 :
     smtp_server : Your_Server를
     로그인 : your_login
     비밀 번호 : top_secret
 생산 :
   input_location : common_input
   output_location : dev_location
   메일 :
     smtp_server : Your_Server를
     로그인 : your_login
     비밀 번호 : top_secret 

/ test.yml 여기는 / tmp에 위의 코드 가정할 때 당신이 어떻게 파이썬과 루비에서 읽을 수 있습니다
$cat readyml.py

 #!은 / usr / 빈 / 환경을의 비단뱀
 pp로 pprint 가져오기 pprint에서
 # 데비안을 설치할 필요에 비단뱀 - yaml
 yaml 수입로드, load_all에서 덤프
 해시 = 하중 (오픈 ( '/ tmp를 / test.yml'))
 pp ()는 [ '개발'] 해시 


$ cat readyml.rb

  #!은 / usr / 빈 / 환경을 루비
 필요 'pp'
 해시 = YAML : : 하중 (File.open ( '/ tmp를 / test.yml'). 읽기)
 pp 해시 [ '개발'] 

여기에 루비 버전에 대한 편리한 하나의 정기선입니다
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' 또는 콘솔 비단뱀 시도하거나 IRB 같은를하실 수 있습니다.

저 위의 코드 발췌 문장에서 모든 다른 출력 위치보다 참고 같은 개발 및 생산의 일부입니다. yml 노드 식별자는 구출하러 오는 곳이에요. 아이디어는 간단합니다 기본값 집합을 가지고 있고 다른 장소에서 그들을 우선합니다.
당신은 떨어져으로 끌어 당길 수도 있고 다음과 같습니다 :

  기본값 : & 기본값
   input_location : common_input
   output_location : dev_location
   메일 :
     sender_name 님이 : 발신자
     smtp_server : Your_Server를
     로그인 : your_login
     비밀 번호 : top_secret
 개발 :
   <<이 : * 기본값
 생산 :
   <<이 : * 기본값
   output_location : prod_location 


$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

좋아요, 이건 (TM)를! 작동합니다.
확실하게 우리가 마법을 조금위한 몇 가지 선명도를 바꿨어. 여기 작은 설명입니다 : &, * 및 <<: & 태그는 노드 식별자로 구분할 수있는 앵커입니다 * 노드 참조 및 <<입니다 : 해쉬 병합을 의미합니다.

더 자세한 내용도보고 yaml 사양 이나 위키 피 디아를
아직까지는 없지만 좋은 거기 잡기는 여기,이 해시 재귀 병합은되지 않습니다. 무슨 뜻이있다 : 당신이 두 환경에서 메일을 보낸 사람에 대해 다른 이름을 갖고 싶어 말을하자, 당신은 다음을 수행할 수 있습니다 유혹 :

  기본값 : & 기본값
   input_location : common_input
   output_location : dev_location
   메일 :
     sender_name 님이 : 발신자
     smtp_server : Your_Server를
     로그인 : your_login
     비밀 번호 : top_secret
 개발 :
   <<이 : * 기본값
   메일 :
     sender_name 님이 : sender_dev
 생산 :
   <<이 : * 기본값
   output_location : prod_location
   메일 :
     sender_name 님이 : sender_prod 

하자 검사

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$

죄송합니다, 잘못, 문제는 위에서 언급한 바와 같이 가서 그 해시 재귀되지 않으며 병합하는 동안 그것은 생산의 유일한 열쇠를 갖고 우편으로 기본 메일을 교체 병합됩니다. 한 번 더 수준을 풀다하는 솔루션 / 작품 주위에 있습니다 :

  common_settings : & common_settings
 input_location : common_input
 output_location : dev_location
 mail_defaults : & mail_defaults
  sender_name 님이 : 발신자
   smtp_server : Your_Server를
   로그인 : your_login
   비밀 번호 : top_secret

 기본값 : & 기본값
   <<: *의 common_settings
   메일 :
     <<: *의 mail_defaults
 개발 :
   <<이 : * 기본값
 생산 :
   <<이 : * 기본값
   메일 :
     <<: *의 mail_defaults
     sender_name 님이 : sender_prod

다시 확인하자

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

당신이 둥지를 하나 더 수준이 말했어요, 그럼 당신은 분명히, 한 번만 더 레벨을 풀다 수 있지만 그때는 엉망이된다. 당신은 하노이의 타워 conf의 파일에 솔루션을 쓰려고하지 않으면 그래서, 그것은 yaml 또는 다른 존재로 파고보다 conf의 파일을 restucture하는 것이 좋습니다. 하지만 어쨌든 당신 전화입니다.

댓글

    블로그 Disqus에 의해 제공 코멘트