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
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 )
&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
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
.
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 '<<:'