Що означають &, <<, * у цьому файлі 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

2
Дивіться також: yaml.org/type/merge.html
dreftymac

Відповіді:


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 Структури для отримання детальної інформації (або якщо вам потрібні навіть мур-документи ++: 3.2.2.2. Якіри та псевдоніми )


2
Цікаво: "тест" розширюється на тест: & тестовий адаптер: postgresql # з бази даних псевдонімів "за замовчуванням": dev_development # з бази даних псевдонімів "за замовчуванням": test_test Щоб бути повністю точним. Чи переважає друга "база даних" ту, на яку посилається "* за замовчуванням"?
Грипп

2
@Gripp Так, ключ бази даних оголошується після <<: *defaultйого перезапис. З YAML це виробляє{"development"=>{"adapter"=>"postgresql", "database"=>"dev_development"}, "test"=>{"adapter"=>"postgresql", "database"=>"test_test"}}
містер Тао

13

&default означає, що ви позначаєте цей набір атрибутів якоюсь назвою для подальшого використання

<<: *default означає, що ви включаєте всі атрибути групи, позначеної як за замовчуванням


9

Вони представляють посилання на вузли (*) та об'єднання асоціативного масиву (<<), які посилаються на вузол, позначений тегом anchor (&) - wikipedia

Спробуйте самі в Інтернеті .


3

Вони є способом посилатися на середовища, не повторюючи одні й ті ж настройки знову і знову (сушать це).

test: &test
  <<: *default

&test створює посилання на ці конкретні налаштування.

<<: *default говорить, використовуйте параметри за замовчуванням для тесту

cucumber:
  <<: *test

Тож тепер ми знаємо, що для цього cucumberми хочемо використовувати налаштування від test.


2

Простими словами, це поняття нагадує базовий та похідний клас.

У шаблоні базового класу ви згадуєте всі загальні деталі за допомогою "&", а це означає, що його можна використовувати для розширення іншого розділу ямл, який потребує цих полів. Тепер, коли ви створюєте інший розділ, який є набором значень конфігурацій цієї структури типу 'базовий клас', ви використовуєте '*' разом із якорем базового класу (тобто тим, що розпочався з '&'). Ви використовуєте "<<:" як поняття 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

Але, якщо ви не хочете переосмислювати розширені поля, ви можете пропустити '<<:'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.