Что означают &, <<, * в этом файле 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
OpenCoderX
источник
6
В файле yml вам не нужно переписывать параметры подключения к базе данных снова и снова в другой среде, если параметры подключения похожи. Здесь, в вышеупомянутом случае, среда cucumber использует точные параметры соединения, как в тестовой среде. И производственная среда использует параметры соединения, как при разработке, кроме имени базы данных. Это что-то вроде СУХОГО (не повторяйте себя) кода. Пожалуйста, не стесняйтесь поправлять меня.
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 Структуры для получения дополнительной информации (или если вам нужны даже moar docs ++: 3.2.2.2. Якоря и псевдонимы )

паскаль
источник
2
Любопытно: «test» расширяется до test: & test adapter: postgresql # из базы данных псевдонимов «default»: dev_development # из базы данных псевдонимов «default»: test_test Чтобы быть полностью точным. Вторая «база данных» переопределяет ту, на которую ссылается «* default»?
Gripp
2
@Gripp Да, ключ базы данных, объявленный после <<: *defaultего перезаписи. С YAML он производит{"development"=>{"adapter"=>"postgresql", "database"=>"dev_development"}, "test"=>{"adapter"=>"postgresql", "database"=>"test_test"}}
г-н Тао
13

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

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

keymone
источник
9

Они представляют ссылки на узлы (*) и объединения ассоциативных массивов (<<), которые ссылаются на узел, помеченный тегом привязки (&) - wikipedia

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

Сэм Руби
источник
3

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

test: &test
  <<: *default

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

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

cucumber:
  <<: *test

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

thenengah
источник
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

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

Мохаммад Шахид Сиддики
источник