Cosa significa &, <<, * in questo file database.yml?


161

Fino ad ora ho usato solo database.yml con ogni parametro chiamato esplicitamente, nel file sottostante usa alcuni caratteri che non capisco. Cosa significano ogni riga e simbolo (&, *, <<), come posso leggere questo file?

development: &default
  adapter: postgresql
  database: dev_development

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


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production

6
Nel file yml non è necessario riscrivere ripetutamente i parametri di connessione al database in un ambiente diverso se i parametri di connessione sono simili. In questo caso, il cetriolo dell'ambiente utilizza i parametri di connessione esatti come nell'ambiente di test. E l'ambiente di produzione utilizza i parametri di connessione come nello sviluppo tranne il nome del database. Questo è qualcosa come il codice DRY (non ripetere te stesso). Non esitate a correggermi.
kxhitiz,

Risposte:


191

I &segni di un alias per il nodo (nel tuo esempio &defaultalias il nodo di sviluppo come "default") ed i *riferimenti del nodo alias con il nome di "default". Il<<: inserisce il contenuto di tale nodo.

Mi permetta di citare le specifiche YAML qui:

I nodi ripetuti (oggetti) vengono prima identificati da un punto di ancoraggio (contrassegnato con la e commerciale - "&"), e successivamente vengono aliasati (indicati con un asterisco - "*").

Quindi parti del tuo esempio

development: &default
  adapter: postgresql
  database: dev_development

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

espandersi effettivamente a

development: &default
  adapter: postgresql
  database: dev_development

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

e allo stesso tempo rendere disponibile anche il nodo "test" sotto l'alias "test".

Dai un'occhiata alla specifica YAML - 2.2 Strutture per ulteriori dettagli (o se hai bisogno anche di documenti moar ++: 3.2.2.2. Ancore e alias )


2
Curioso: "test" si espande per testare: & test adapter: postgresql # dal database alias "predefinito": dev_development # dal database alias "predefinito": test_test Per essere completamente accurati. Il secondo "database" ha la precedenza su quello a cui fa riferimento "* default"?
Gripp,

2
@Gripp Sì, la chiave del database dichiarata dopo la <<: *defaultsovrascrive. Con YAML produce{"development"=>{"adapter"=>"postgresql", "database"=>"dev_development"}, "test"=>{"adapter"=>"postgresql", "database"=>"test_test"}}
Mr. Tao

13

&default significa che stai etichettando questo insieme di attributi con un nome per un uso successivo

<<: *default significa che stai includendo tutti gli attributi del gruppo etichettati come predefiniti


9

Questi rappresentano riferimenti a nodi (*) e fusioni di array associativi (<<) che fanno riferimento a un nodo etichettato con un tag anchor (&) - wikipedia

Provalo tu stesso online .


3

Sono un modo per fare riferimento agli ambienti senza dover ripetere le stesse impostazioni più volte (DRY it up).

test: &test
  <<: *default

&test crea un riferimento a tali impostazioni specifiche.

<<: *default dice di usare le impostazioni predefinite per il test

cucumber:
  <<: *test

Quindi ora sappiamo che per cucumbervogliamo usare le impostazioni da test.


2

In parole semplici, questa nozione assomiglia alla classe base e derivata.

Nel modello di classe base, menzioni tutti i dettagli comuni con '&', il che significa che può essere utilizzato per espandere l'altra sezione yaml che necessita di questi campi. Ora quando crei un'altra sezione che è un insieme di valori di configurazione di questa struttura di tipo 'classe base', usi '*' insieme all'ancoraggio della classe base (cioè quello iniziato con '&'). Usa '<<:' come nozione di yaml per posizionare effettivamente la sezione 'classe base', che puoi sovrascrivere in seguito.

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

Ma, se non si desidera sovrascrivere i campi estesi, è possibile saltare "<<:"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.