Apa arti dari &, <<, * dalam file database.yml ini?

161

Sampai sekarang saya hanya menggunakan database.yml dengan setiap parameter dipanggil secara eksplisit, dalam file di bawah ini menggunakan beberapa karakter yang saya tidak mengerti. Apa arti setiap baris dan simbol (&, *, <<), bagaimana cara saya membaca file ini?

development: &default
  adapter: postgresql
  database: dev_development

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


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production
OpenCoderX
sumber
6
Dalam file yml Anda tidak perlu menulis ulang parameter koneksi database berulang-ulang di lingkungan yang berbeda jika paramsenya serupa. Di sini, dalam kasus yang disebutkan di atas, mentimun lingkungan menggunakan params koneksi yang tepat seperti dalam lingkungan pengujian. Dan lingkungan produksi menggunakan params koneksi seperti dalam pengembangan kecuali nama database. Ini adalah sesuatu seperti kode KERING (Jangan ulangi diri Anda sendiri). Silakan mengoreksi saya.
kxhitiz
2
Lihat juga: yaml.org/type/merge.html
dreftymac

Jawaban:

191

The &tanda alias untuk node (dalam contoh &defaultalias node pembangunan sebagai "default") dan *referensi node alias dengan nama "default". The <<:menyisipkan isi dari simpul tersebut.

Izinkan saya mengutip spec YAML di sini:

Node berulang (objek) pertama kali diidentifikasi oleh jangkar (ditandai dengan ampersand - "&"), dan kemudian alias (dirujuk dengan tanda bintang - "*") sesudahnya.

Jadi, bagian dari contoh Anda

development: &default
  adapter: postgresql
  database: dev_development

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

sebenarnya berkembang menjadi

development: &default
  adapter: postgresql
  database: dev_development

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

dan pada saat yang sama membuat simpul "test" juga tersedia di bawah alias "test".

Lihatlah spesifikasi YAML - 2.2 Struktur untuk perincian lebih lanjut (atau jika Anda bahkan perlu dokumen moar ++: 3.2.2.2. Jangkar dan Alias )

Pascal
sumber
2
Penasaran: "test" memperluas untuk menguji: & test adapter: postgresql # dari database alias "default": dev_development # dari database "default" alias: test_test Agar sepenuhnya akurat. Apakah "database" kedua menggantikan yang dirujuk dari "* default"?
Gripp
2
@ Gripp Ya, kunci basis data dideklarasikan setelah <<: *defaultditimpa. Dengan YAML yang dihasilkannya{"development"=>{"adapter"=>"postgresql", "database"=>"dev_development"}, "test"=>{"adapter"=>"postgresql", "database"=>"test_test"}}
Bpk. Tao
13

&default berarti Anda memberi label rangkaian atribut ini dengan beberapa nama untuk digunakan nanti

<<: *default berarti Anda memasukkan semua atribut dari grup yang berlabel default

keymone
sumber
9

Ini mewakili referensi simpul (*) dan gabungan array asosiatif (<<) yang merujuk ke sebuah simpul yang berlabel jangkar (&) - wikipedia

Cobalah sendiri secara online .

Sam Ruby
sumber
3

Mereka adalah cara untuk referensi lingkungan tanpa harus mengulangi pengaturan yang sama berulang-ulang (KERING itu).

test: &test
  <<: *default

&test membuat referensi ke pengaturan spesifik tersebut.

<<: *default mengatakan gunakan pengaturan default untuk tes ini

cucumber:
  <<: *test

Jadi sekarang kita tahu bahwa cucumberkita ingin menggunakan pengaturan dari test.

thenengah
sumber
2

Dengan kata sederhana, gagasan ini menyerupai kelas dasar dan turunan.

Di templat kelas dasar, Anda menyebutkan semua detail umum dengan '&', yang berarti dapat digunakan untuk memperluas bagian yaml lain yang membutuhkan bidang ini. Sekarang ketika Anda membuat bagian lain yang merupakan superset dari nilai konfigurasi dari struktur tipe 'kelas dasar' ini, Anda menggunakan '*' bersama dengan jangkar kelas dasar (yaitu yang dimulai dengan '&'). Anda menggunakan '<<:' sebagai gagasan yaml untuk benar-benar menempatkan bagian 'kelas dasar', yang dapat Anda timpa nanti.

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

Tetapi, jika Anda tidak ingin mengganti bidang yang diperluas, Anda dapat melewati '<<:'

Mohammad Shahid Siddiqui
sumber