이 database.yml 파일에서 &, <<, *의 의미는 무엇입니까?


161

지금까지는 각 매개 변수가 명시 적으로 호출 된 database.yml 만 사용했으며 아래 파일에서 이해할 수없는 문자가 사용되었습니다. 각 줄과 기호 (&, *, <<)는 무엇을 의미합니까?이 파일을 어떻게 읽습니까?

development: &default
  adapter: postgresql
  database: dev_development

test: &test
  <<: *default
  database: test_test


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production

6
yml 파일에서는 연결 매개 변수가 비슷한 경우 다른 환경에서 데이터베이스 연결 매개 변수를 반복해서 다시 쓸 필요가 없습니다. 위에서 언급 한 경우 환경 오이는 테스트 환경과 동일한 연결 매개 변수를 사용합니다. 그리고 프로덕션 환경은 데이터베이스 이름을 제외하고 개발에서와 같이 연결 매개 변수를 사용합니다. 이것은 DRY (반복하지 마십시오) 코드와 같은 것입니다. 자유롭게 고쳐주세요.
kxhitiz

답변:


191

&(귀하의 예제에서 마크 노드의 별명 &default별명 "기본"으로 개발 노드)와 *참조 이름이 "기본"으로 별칭 노드입니다. 은 <<:해당 노드의 내용을 삽입합니다.

여기에서 YAML 사양을 인용하십시오.

반복 노드 (오브젝트)는 먼저 앵커 (앰퍼샌드 ( "&"로 표시)로 식별 한 다음 별명 ( "*"로 표시)를 나타냅니다.

예를 들어

development: &default
  adapter: postgresql
  database: dev_development

test: &test
  <<: *default
  database: test_test

실제로 확장

development: &default
  adapter: postgresql
  database: dev_development

test: &test
  adapter: postgresql       # from the "default" alias
  database: test_test       # overridden by the duplicate key

동시에 "test"노드를 별명 "test"로 사용할 수있게하십시오.

자세한 내용 은 YAML 사양 -2.2 구조 를 참조하십시오 (또는 심지어 moar docs ++가 필요한 경우 : 3.2.2.2. 앵커 및 별칭 )


2
궁금한 점 : "test"가 테스트로 확장됩니다. & test 어댑터 : "default"별칭 데이터베이스의 postgresql # : "default"별칭 데이터베이스의 dev_development # : test_test 완전히 정확합니다. 두 번째 "데이터베이스"가 "* default"에서 참조 된 데이터베이스를 대체합니까?
Gripp

2
@Gripp 예, <<: *default덮어 쓴 후에 선언 된 데이터베이스 키 . 함께 YAML 은 생산{"development"=>{"adapter"=>"postgresql", "database"=>"dev_development"}, "test"=>{"adapter"=>"postgresql", "database"=>"test_test"}}
씨 타오에게

13

&default 나중에 사용할 수 있도록이 속성 집합에 이름을 레이블로 지정했음을 의미합니다.

<<: *default 기본으로 분류 된 그룹의 모든 속성을 포함 함을 의미합니다.



3

동일한 설정을 반복해서 반복하지 않고도 환경을 참조 할 수있는 방법입니다 (건조).

test: &test
  <<: *default

&test 특정 설정에 대한 참조를 만듭니다.

<<: *default 테스트에 기본 설정을 사용한다고 말합니다.

cucumber:
  <<: *test

이제 우리는 cucumber의 설정을 사용하고 싶다는 것을 알고 있습니다 test.


2

간단히 말해서,이 개념은 기본 클래스와 파생 클래스와 유사합니다.

기본 클래스 템플릿에서 '&'로 모든 공통 세부 사항을 언급하므로 이러한 필드가 필요한 다른 yaml 섹션을 확장하는 데 사용할 수 있습니다. 이제이 '기본 클래스'유형 구조의 구성 값으로 구성된 다른 섹션을 작성할 때 기본 클래스 앵커와 함께 '*'를 사용하십시오 (예 : '&'로 시작하는 섹션). 실제로 '기본 클래스'섹션을 배치하기 위해 '<< :'을 yaml 개념으로 사용하므로 나중에 재정의 할 수 있습니다.

vsm:
  stub_nsx_mgr: &MGR_CTRL_STUB
    username: ADMIN
    password: $DEFAULT_PASSWORD
    deployment: ovf
    build: $PR_BUILD
    vmnics:
      - network: $MANAGEMENT_NETWORK_0
    vc: vc_0
    ovf_options:
      - --diskMode=$DISKMODE
      - --deploymentOption=$DEPLOYMENT_OPTION
$MGR_0:
    <<: *MGR_CTRL_STUB
    ovf_path_regex: 'appliance.*\.ovf'
    ovf_options:
      - --diskMode=$DISKMODE
      - --deploymentOption=$DEPLOYMENT_OPTION
$CTRL_0:
    <<: *MGR_CTRL_STUB
    ovf_options:
      - --diskMode=$DISKMODE
      - --allowExtraConfig
$CTRL_1:
    *MGR_CTRL_STUB

그러나 확장 필드를 무시하지 않으려면 '<< :'를 건너 뛸 수 있습니다.

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