Was bedeutet das &, <<, * in dieser Datei database.yml?

161

Bisher habe ich nur database.yml für jeden explizit aufgerufenen Parameter verwendet. In der folgenden Datei werden einige Zeichen verwendet, die ich nicht verstehe. Was bedeutet jede Zeile und jedes Symbol (&, *, <<), wie lese ich diese Datei?

development: &default
  adapter: postgresql
  database: dev_development

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


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production
OpenCoderX
quelle
6
In der yml-Datei müssen Sie die Datenbankverbindungsparameter in einer anderen Umgebung nicht immer wieder neu schreiben, wenn die Verbindungsparameter ähnlich sind. Hier verwendet die Umgebungsgurke im oben genannten Fall die genauen Verbindungsparameter wie in der Testumgebung. In der Produktionsumgebung werden die Verbindungsparameter wie in der Entwicklung verwendet, mit Ausnahme des Datenbanknamens. Dies ist so etwas wie DRY-Code (Wiederholen Sie sich nicht). Bitte zögern Sie nicht, mich zu korrigieren.
kxhitiz
2
Siehe auch: yaml.org/type/merge.html
dreftymac

Antworten:

191

Das &markiert einen Alias ​​für den Knoten (in Ihrem Beispiel &defaultaliasiert der Entwicklungsknoten als "Standard") und *verweist auf den Alias-Knoten mit dem Namen "Standard". Das <<:fügt den Inhalt dieses Knotens ein.

Gestatten Sie mir, die YAML-Spezifikation hier zu zitieren:

Wiederholte Knoten (Objekte) werden zuerst durch einen Anker identifiziert (gekennzeichnet mit dem kaufmännischen Und - "&") und anschließend mit einem Alias ​​versehen (mit einem Sternchen gekennzeichnet - "*").

Also Teile Ihres Beispiels

development: &default
  adapter: postgresql
  database: dev_development

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

tatsächlich erweitern auf

development: &default
  adapter: postgresql
  database: dev_development

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

und gleichzeitig den "Test" -Knoten auch unter dem Alias ​​"Test" verfügbar machen.

Weitere Informationen finden Sie in der YAML-Spezifikation - 2.2 Strukturen (oder wenn Sie noch mehr Dokumente benötigen ++: 3.2.2.2. Anker und Aliase )

Pascal
quelle
2
Neugierig: "test" wird zu test: & test adapter: postgresql # aus der "Standard" -Aliasdatenbank: dev_development # aus der "Standard" -Aliasdatenbank: test_test Um vollständig genau zu sein. Überschreibt die zweite "Datenbank" diejenige, auf die von "* default" verwiesen wird?
Gripp
2
@Gripp Ja, der Datenbankschlüssel wurde deklariert, nachdem er <<: *defaultüberschrieben wurde. Mit YAML produziert es{"development"=>{"adapter"=>"postgresql", "database"=>"dev_development"}, "test"=>{"adapter"=>"postgresql", "database"=>"test_test"}}
Mr. Tao
13

&default bedeutet, dass Sie diese Attribute mit einem Namen für die spätere Verwendung kennzeichnen

<<: *default bedeutet, dass Sie alle Attribute aus der Gruppe einschließen, die als Standard gekennzeichnet sind

Keymone
quelle
9

Diese stellen Knotenreferenzen (*) und assoziative Array-Zusammenführungen (<<) dar, die sich auf einen Knoten beziehen, der mit einem Ankertag (&) gekennzeichnet ist - Wikipedia

Probieren Sie es selbst online aus .

Sam Ruby
quelle
3

Sie sind eine Möglichkeit, Umgebungen zu referenzieren, ohne dieselben Einstellungen immer wieder wiederholen zu müssen (DRY it up).

test: &test
  <<: *default

&test Erstellt einen Verweis auf diese spezifischen Einstellungen.

<<: *default sagt, verwenden Sie die Standardeinstellungen für den Test

cucumber:
  <<: *test

Jetzt wissen wir also, dass cucumberwir die Einstellungen von verwenden möchten test.

thenengah
quelle
2

In einfachen Worten ähnelt dieser Begriff der Basisklasse und der abgeleiteten Klasse.

In der Basisklassenvorlage erwähnen Sie alle allgemeinen Details mit '&'. Dies bedeutet, dass Sie damit den anderen Yaml-Abschnitt erweitern können, der diese Felder benötigt. Wenn Sie jetzt einen anderen Abschnitt erstellen, der eine Obermenge der Konfigurationswerte dieser Typstruktur vom Typ 'Basisklasse' enthält, verwenden Sie das '*' zusammen mit dem Basisklassenanker (dh dem mit '&' begonnenen). Sie verwenden '<<:' als Yaml-Begriff, um den Abschnitt 'Basisklasse' tatsächlich zu platzieren, den Sie später überschreiben können.

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

Wenn Sie die erweiterten Felder jedoch nicht überschreiben möchten, können Sie '<<:' überspringen.

Mohammad Shahid Siddiqui
quelle