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 

여기에 / tmp를 / test.yml 코드에 위의 가정하면 파이썬과 루비에서 읽을 수있는 방법입니다
$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 아니면 다른 문제로 파고보다 믿어 파일을 restucture 것이 좋습니다. 그러나 어쨌든 당신 전화입니다.