Что означают &, <<, * в этом файле database.yml? - PullRequest
139 голосов
/ 11 июля 2011

До сих пор я использовал только database.yml с каждым явно вызванным параметром, в приведенном ниже файле используются некоторые символы, которые я не понимаю. Что означает каждая строка и символ (&, *, <<), как мне прочитать этот файл? </p>

development: &default
  adapter: postgresql
  database: dev_development

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


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production

Ответы [ 5 ]

166 голосов
/ 11 июля 2011

& отмечает псевдоним для узла (в вашем примере &default именует узел разработки как "по умолчанию"), а * ссылается на псевдоним узла с именем "по умолчанию".<<: вставляет содержимое этого узла.

Позвольте мне процитировать спецификацию YAML здесь:

Повторяющиеся узлы (объекты) сначала идентифицируются привязкой (отмеченнойамперсанд - «&»), а затем псевдоним (обозначается звездочкой - «*»).

, поэтому части вашего примера

test: &test
  <<: *default

фактически расширяются до

test: &test
  adapter: postgresql       # from the "default" alias
  database: dev_development # from the "default" alias

и в то же время сделать узел «test» также доступным под псевдонимом «test».взгляните на спецификацию YAML - 2.2 Structures для более подробной информации (или если вам нужны даже moar docs ++: 3.2.2.2. Якоря и псевдонимы )

9 голосов
/ 11 июля 2011

Они представляют ссылки на узлы (*) и объединения ассоциативных массивов (<<), которые ссылаются на узел, помеченный тегом привязки (&) - <a href="http://en.wikipedia.org/wiki/YAML#Data_merge_and_references"> wikipedia

Попробуйте сами онлайн .

8 голосов
/ 11 июля 2011

&default означает, что вы помечаете этот набор атрибутов некоторым именем для последующего использования

<<: *default означает, что вы включаете все атрибуты из группы, помеченной как значение по умолчанию

2 голосов
/ 11 июля 2011

Это способ задания условий без необходимости повторять одни и те же настройки снова и снова (СУШИТЕ это).

test: &test
  <<: *default

&test создает ссылку на эти конкретные настройки.

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

cucumber:
  <<: *test

Итак, теперь мы знаем, что для cucumber мы хотим использовать настройки из test.

1 голос
/ 07 февраля 2018

Проще говоря, это понятие напоминает базовый и производный класс.

В шаблоне базового класса вы упоминаете все общие детали с помощью '&', что означает, что его можно использовать для расширения другого раздела yaml, которому нужны эти поля. Теперь, когда вы создаете другой раздел, который является надмножеством значений конфигурации этой структуры типа «базовый класс», вы используете «*» вместе с якорем базового класса (т. Е. Тот, который начинается с «&»). Вы используете «<<:» в качестве понятия yaml для фактического размещения раздела «базовый класс», который вы можете переопределить позже. </p>

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

Но, если вы не хотите переопределять расширенные поля, вы можете пропустить '<<:' </p>

...