web-dev-qa-db-fra.com

Que signifie le &, <<, * dans ce fichier database.yml?

Jusqu'à présent, je n'ai utilisé database.yml qu'avec chaque paramètre appelé explicitement, dans le fichier ci-dessous, il utilise des caractères que je ne comprends pas. Que signifie chaque ligne et symbole (&, *, <<), comment lire ce fichier?

development: &default
  adapter: postgresql
  database: dev_development

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


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production
140
holaSenor

Le & marque un alias pour le nœud (dans votre exemple &default alias le nœud de développement comme "par défaut") et * fait référence au nœud aliasé avec le nom "default". Le <<: insère le contenu de ce nœud.

Permettez-moi de citer la spécification YAML ici:

Les nœuds répétés (objets) sont d'abord identifiés par une ancre (marquée avec l'esperluette - "&"), puis sont aliasés (référencés avec un astérisque - "*") par la suite.

donc des parties de votre exemple

test: &test
  <<: *default

étendre réellement à

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

et en même temps rendre le nœud "test" également disponible sous l'alias "test". jetez un oeil à la spécification YAML - 2.2 Structures pour plus de détails (ou si vous avez besoin de docs moar ++: .2.2.2. Ancres et alias )

168
paukul

Ceux-ci représentent des références de nœuds (*) et des fusions de tableaux associatifs (<<) qui font référence à un nœud étiqueté avec une balise d'ancrage (&) - wikipedia

Essayez-le vous-même en ligne .

9
Sam Ruby

&default signifie que vous étiquetez cet ensemble d'attributs avec un nom pour une utilisation ultérieure

<<: *default signifie que vous incluez tous les attributs du groupe étiquetés par défaut

8
keymone

Ils sont un moyen de référencer des environnements sans avoir à répéter les mêmes paramètres encore et encore (DRY it up).

test: &test
  <<: *default

&test crée une référence à ces paramètres spécifiques.

<<: *default dit utiliser les paramètres par défaut pour le test

cucumber:
  <<: *test

Alors maintenant, nous savons que pour cucumber, nous voulons utiliser les paramètres de test.

2
thenengah

En termes simples, cette notion ressemble à la classe de base et dérivée.

Dans le modèle de classe de base, vous mentionnez tous les détails communs avec "&", ce qui signifie qu'il peut être utilisé pour développer l'autre section yaml qui a besoin de ces champs. Maintenant, lorsque vous créez une autre section qui est un surensemble de valeurs de configuration de cette structure de type `` classe de base '', vous utilisez le '*' avec l'ancre de la classe de base (c'est-à-dire celle commençant par '&'). Vous utilisez '<<:' comme notion yaml pour placer réellement la section 'classe de base', que vous pouvez remplacer plus tard.

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

Mais, si vous ne souhaitez pas remplacer les champs étendus, vous pouvez ignorer '<<:'

1