yaml conf 파일의 해시를 병합
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하는 것이 좋습니다. 하지만 어쨌든 당신 전화입니다.



































