O que o &, <<, * significa neste arquivo database.yml?

161

Até agora, usei database.yml apenas com cada parâmetro explicitamente chamado, no arquivo abaixo, ele usa alguns caracteres que não entendo. O que significa cada linha e símbolo (&, *, <<), como faço para ler este arquivo?

development: &default
  adapter: postgresql
  database: dev_development

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


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production
OpenCoderX
fonte
6
No arquivo yml, não é necessário reescrever os parâmetros de conexão com o banco de dados repetidamente em ambiente diferente se os parâmetros de conexão forem semelhantes. Aqui no caso mencionado acima, o pepino do ambiente usa os parâmetros de conexão exatos como no ambiente de teste. E o ambiente de produção usa os parâmetros de conexão como em desenvolvimento, exceto o nome do banco de dados. Isso é algo como código DRY (não se repita). Por favor, sinta-se livre para me corrigir.
kxhitiz
2
Veja também: yaml.org/type/merge.html
dreftymac

Respostas:

191

As &marcas de um alias para o nó (no seu exemplo &defaultaliases o nó desenvolvimento como "default") e as *referências ao nó alias com o nome "default". O <<:insere o conteúdo desse nó.

Permita-me citar a especificação YAML aqui:

Os nós repetidos (objetos) são identificados primeiro por uma âncora (marcada com o e comercial - "&") e, em seguida, são alternados (referenciados com um asterisco - "*") a partir de então.

Então, partes do seu exemplo

development: &default
  adapter: postgresql
  database: dev_development

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

realmente expandir para

development: &default
  adapter: postgresql
  database: dev_development

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

e, ao mesmo tempo, disponibilize o nó "test" também no alias "test".

Dê uma olhada na especificação YAML - 2.2 Structures para obter mais detalhes (ou se você precisar de documentos moar ++: 3.2.2.2. Âncoras e aliases )

Pascal
fonte
2
Curioso: "test" se expande para test: & test adapter: postgresql # do banco de dados de alias "padrão": dev_development # do banco de dados de alias "padrão": test_test Para ser completamente preciso. O segundo "banco de dados" substitui o referenciado de "* padrão"?
Gripp
2
@Gripp Sim, a chave do banco de dados declarada após <<: *defaultsubstituí-la. Com YAML, ele produz #{"development"=>{"adapter"=>"postgresql", "database"=>"dev_development"}, "test"=>{"adapter"=>"postgresql", "database"=>"test_test"}}
Mr. Tao
13

&default significa que você está rotulando esse conjunto de atributos com algum nome para uso posterior

<<: *default significa que você está incluindo todos os atributos do grupo rotulado como padrão

keymone
fonte
9

Representam referências de nó (*) e mesclagens associativas de matriz (<<) que se referem a um nó rotulado com uma marca de âncora (&) - wikipedia

Experimente você mesmo online .

Sam Ruby
fonte
3

Eles são uma maneira de fazer referência a ambientes sem precisar repetir as mesmas configurações repetidamente (seque-as).

test: &test
  <<: *default

&test cria uma referência para essas configurações específicas.

<<: *default diz usar as configurações padrão para o teste

cucumber:
  <<: *test

Então agora sabemos que cucumberqueremos usar as configurações de test.

thenengah
fonte
2

Em palavras simples, essa noção se assemelha à classe base e derivada.

No modelo de classe base, você menciona todos os detalhes comuns com '&', o que significa que ele pode ser usado para expandir a outra seção do yaml que precisa desses campos. Agora, quando você cria outra seção que é um superconjunto de valores de configuração dessa estrutura do tipo 'classe base', você usa o '*' junto com a âncora da classe base (ou seja, aquela iniciada com '&'). Você usa '<<:' como noção yaml para realmente colocar a seção 'classe base', que você pode substituir posteriormente.

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

Mas, se você não deseja substituir os campos estendidos, pode pular '<<:'

Mohammad Shahid Siddiqui
fonte