¿Qué significan &, <<, * en este archivo database.yml?

161

Hasta ahora solo he usado database.yml con cada parámetro llamado explícitamente, en el archivo a continuación usa algunos caracteres que no entiendo. ¿Qué significa cada línea y símbolo (&, *, <<), ¿cómo leo este archivo?

development: &default
  adapter: postgresql
  database: dev_development

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


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production
OpenCoderX
fuente
66
En el archivo yml no tiene que volver a escribir los parámetros de conexión de la base de datos una y otra vez en un entorno diferente si los parámetros de conexión son similares. Aquí, en el caso mencionado anteriormente, el pepino del entorno utiliza los parámetros de conexión exactos como en el entorno de prueba. Y el entorno de producción utiliza los parámetros de conexión como en el desarrollo, excepto el nombre de la base de datos. Esto es algo así como el código DRY (no se repita). Por favor, siéntase libre de corregirme.
kxhitiz
2
Ver también: yaml.org/type/merge.html
dreftymac

Respuestas:

191

Las &marcas de un alias para el nodo (en su ejemplo &defaultalias del nodo de desarrollo como "default") y las *referencias al nodo alias con el nombre "default". El <<:inserta el contenido de ese nodo.

Permítanme citar las especificaciones de YAML aquí:

Los nodos repetidos (objetos) se identifican primero con un ancla (marcada con el signo "&"), y luego se alias (se hace referencia con un asterisco - "*") a partir de entonces.

Así que partes de tu ejemplo

development: &default
  adapter: postgresql
  database: dev_development

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

en realidad ampliar a

development: &default
  adapter: postgresql
  database: dev_development

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

y al mismo tiempo haga que el nodo "prueba" también esté disponible bajo el alias "prueba".

Eche un vistazo a la especificación YAML - Estructuras 2.2 para más detalles (o si necesita incluso documentos de moar ++: 3.2.2.2. Anclas y alias )

Pascal
fuente
2
Curioso: "prueba" se expande para probar: & adaptador de prueba: postgresql # de la base de datos de alias "predeterminada": dev_development # de la base de datos de alias "predeterminada": test_test Para ser completamente exacto. ¿La segunda "base de datos" anula la referenciada desde "* default"?
Gripp
2
@Gripp Sí, la clave de la base de datos declarada después de <<: *defaultsobrescribirla. Con YAML produce{"development"=>{"adapter"=>"postgresql", "database"=>"dev_development"}, "test"=>{"adapter"=>"postgresql", "database"=>"test_test"}}
Mr. Tao
13

&default significa que está etiquetando este conjunto de atributos con algún nombre para su uso posterior

<<: *default significa que está incluyendo todos los atributos del grupo etiquetados como predeterminados

Keymone
fuente
9

Representan referencias de nodo (*) y combinaciones de matrices asociativas (<<) que se refieren a un nodo etiquetado con una etiqueta de anclaje (&) - wikipedia

Pruébelo usted mismo en línea .

Sam Ruby
fuente
3

Son una forma de referenciar entornos sin tener que repetir la misma configuración una y otra vez (SECARLO).

test: &test
  <<: *default

&test crea una referencia a esas configuraciones específicas.

<<: *default dice usar la configuración predeterminada para la prueba

cucumber:
  <<: *test

Así que ahora sabemos que cucumberqueremos usar la configuración de test.

thenengah
fuente
2

En palabras simples, esta noción se parece a la clase base y derivada.

En la plantilla de clase base, mencionas todos los detalles comunes con '&', lo que significa que se puede usar para expandir la otra sección yaml que necesita estos campos. Ahora, cuando crea otra sección que es un superconjunto de valores de configuración de esta estructura de tipo 'clase base', usa '*' junto con el ancla de clase base (es decir, la que comenzó con '&'). Utiliza '<<:' como noción yaml para colocar realmente la sección 'clase base', que puedes anular más adelante.

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

Pero, si no desea anular los campos extendidos, puede omitir '<<:'

Mohammad Shahid Siddiqui
fuente