Co oznaczają &, <<, * w tym pliku database.yml?

161

Do tej pory używałem tylko database.yml z każdym parametrem wywołanym jawnie, w poniższym pliku używa niektórych znaków, których nie rozumiem. Co oznacza każdy wiersz i symbol (&, *, <<), jak odczytać ten plik?

development: &default
  adapter: postgresql
  database: dev_development

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


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production
OpenCoderX
źródło
6
W pliku yml nie musisz wielokrotnie przepisywać parametrów połączenia z bazą danych w innym środowisku, jeśli parametry połączenia są podobne. W powyższym przypadku ogórek środowiska używa dokładnych parametrów połączenia, jak w środowisku testowym. Środowisko produkcyjne używa parametrów połączenia, jak w fazie rozwoju, z wyjątkiem nazwy bazy danych. To jest coś w rodzaju kodu SUCHEGO (nie powtarzaj się). Zapraszam do poprawiania mnie.
kxhitiz
2
Zobacz też: yaml.org/type/merge.html
dreftymac

Odpowiedzi:

191

Te &znaki aliasem dla węzła (W przykładzie &defaultaliasów Węzeł rozwój jako „default”) i *References aliased węzeł o nazwie „default”. Plik<<:Wstawia zawartość tego węzła.

Pozwólcie, że przytoczę tutaj specyfikację YAML:

Powtarzające się węzły (obiekty) są najpierw identyfikowane za pomocą kotwicy (oznaczonej ampersandem - „&”), a następnie są aliasowane (oznaczane gwiazdką - „*”).

A więc część twojego przykładu

development: &default
  adapter: postgresql
  database: dev_development

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

faktycznie rozszerzyć do

development: &default
  adapter: postgresql
  database: dev_development

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

i jednocześnie udostępniaj węzeł „test” również pod aliasem „test”.

Zapoznaj się ze specyfikacją YAML - 2.2 Struktury, aby uzyskać dalsze szczegóły (lub jeśli potrzebujesz nawet moar docs ++: 3.2.2.2. Anchors and Aliases )

Pascal
źródło
2
Ciekawe: „test” rozszerza się, aby przetestować: & test adapter: postgresql # z „domyślnej” bazy danych aliasów: dev_development # z „domyślnej” bazy danych aliasów: test_test Aby było całkowicie dokładne. Czy druga „baza danych” zastępuje tę, do której odwołuje się „* default”?
Gripp
2
@Gripp Tak, klucz bazy danych zadeklarowany po <<: *defaultnadpisaniu go. Z YAML produkuje{"development"=>{"adapter"=>"postgresql", "database"=>"dev_development"}, "test"=>{"adapter"=>"postgresql", "database"=>"test_test"}}
Mr. Tao
13

&default oznacza, że ​​nadajesz temu zestawowi atrybutów etykietę do późniejszego wykorzystania

<<: *default oznacza, że ​​uwzględniasz wszystkie atrybuty z grupy oznaczonej jako domyślna

keymone
źródło
9

Reprezentują one odniesienia do węzłów (*) i asocjacyjne połączenia tablicowe (<<), które odnoszą się do węzła oznaczonego tagiem kotwicy (&) - Wikipedia

Wypróbuj sam online .

Sam Ruby
źródło
3

Są sposobem na odniesienie się do środowisk bez konieczności ciągłego powtarzania tych samych ustawień (DRY it up).

test: &test
  <<: *default

&test tworzy odniesienie do tych konkretnych ustawień.

<<: *default mówi, użyj domyślnych ustawień testu

cucumber:
  <<: *test

Więc teraz wiemy, cucumberże chcemy użyć ustawień z test.

thenengah
źródło
2

W prostych słowach pojęcie to przypomina klasę bazową i pochodną.

W szablonie klasy bazowej wymieniasz wszystkie typowe szczegóły za pomocą znaku „&”, co oznacza, że ​​można go użyć do rozwinięcia innej sekcji yaml, która wymaga tych pól. Teraz, kiedy tworzysz kolejną sekcję, która jest nadzbiorem wartości konfiguracyjnych tej struktury typu „klasa bazowa”, używasz „*” wraz z kotwicą klasy bazowej (tj. Ta, która zaczyna się od „&”). Używasz '<<:' jako pojęcia yaml do faktycznego umieszczania sekcji 'klasy bazowej', którą możesz zmienić później.

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

Ale jeśli nie chcesz zastępować rozszerzonych pól, możesz pominąć „<<:”

Mohammad Shahid Siddiqui
źródło