Penggabungan hash dalam file conf YAML

31 Juli 2009 oleh prashant
Filed under: teknologi

YAML adalah sangat berguna untuk menulis file konfigurasi. Keuntungan utama adalah bahwa, dibaca seperti file teks. Ini bekerja sangat baik jika file konfigurasi Anda adalah datar (hirarki tidak) dan tidak memiliki pengulangan.
Jika konfigurasi file Anda memiliki pengulangan maka masuk akal untuk memisahkan unsur-unsur dan menggunakan kembali mereka. Yang saya maksud adalah ini - katakanlah Anda file konfigurasi Anda terlihat seperti ini:

  pengembangan:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: your_server
     login: your_login
     password: top_secret
 produksi:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: your_server
     login: your_login
     password: top_secret 

Dengan asumsi di atas kode dalam / tmp / test.yml sini adalah bagaimana Anda dapat membaca di python dan ruby
$cat readyml.py

 # / Usr! / Bin / env python
 dari pprint impor pprint sebagai pp
 # Di debian perlu menginstal python-YAML
 dari impor beban YAML, dump load_all,
 hash = beban (terbuka ('/ tmp / test.yml'))
 pp (hash ['pembangunan']) 


$ cat readyml.rb

  # / Usr! / Bin / env ruby
 require 'pp'
 hash = YAML :: load (File.Open ('/ tmp / test.yml'). membaca)
 pp hash ['pembangunan'] 

di sini adalah liner satu berguna untuk versi ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' atau Anda dapat mencoba hal yang sama di irb atau konsol python.

Perhatikan bahwa dalam potongan kode di atas, semuanya selain lokasi output yang sama dalam pembangunan dan bagian produksi. Di sinilah pengenal simpul yml datang untuk menyelamatkan. Ide sederhana memiliki satu set nilai default dan menimpa mereka di tempat yang berbeda.
Anda bisa tarik terpisah sebagai berikut:

  default: default &
   input_location: common_input
   output_location: dev_location
   mail:
     sender_name: pengirim
     smtp_server: your_server
     login: your_login
     password: top_secret
 pengembangan:
   <<: * Defaults
 produksi:
   <<: * Defaults
   output_location: prod_location 


$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

Besar, ia bekerja (tm)!.
Bisa dibilang kita diperdagangkan beberapa petunjuk untuk sedikit sihir. Berikut adalah penjelasan kecil: &, * dan <<: & yang tag anchor dapat dipahami sebagai identifier node, * adalah referensi node dan <<: singkatan dari gabungan hash.

Untuk lebih lengkapnya lihat baik spesifikasi YAML atau wikipedia
Sejauh ini cukup baik tetapi ada menangkap di sini, ini gabungan hash tidak rekursif. Artinya adalah: katakanlah Anda ingin memiliki nama pengirim yang berbeda untuk mail dalam dua lingkungan, Anda mungkin tergoda untuk melakukan hal berikut:

  default: default &
   input_location: common_input
   output_location: dev_location
   mail:
     sender_name: pengirim
     smtp_server: your_server
     login: your_login
     password: top_secret
 pengembangan:
   <<: * Defaults
   mail:
     sender_name: sender_dev
 produksi:
   <<: * Defaults
   output_location: prod_location
   mail:
     sender_name: sender_prod 

Mari kita memeriksa

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$

Ups, ada yang tidak beres, masalah seperti yang disebutkan di atas adalah bahwa menggabungkan hash tidak rekursif dan saat menggabungkan diganti mail default dengan mail produksi yang hanya memiliki satu kunci. Solusi / bekerja di sekitar adalah untuk membuka gulungan satu tingkat lebih lanjut:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  sender_name: pengirim
   smtp_server: your_server
   login: your_login
   password: top_secret

 default: default &
   <<: * Common_settings
   mail:
     <<: * Mail_defaults
 pengembangan:
   <<: * Defaults
 produksi:
   <<: * Defaults
   mail:
     <<: * Mail_defaults
     sender_name: sender_prod

Mari kita cek lagi

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

Apakah Anda mengatakan Anda memiliki tingkat satu lebih banyak bersarang, baik Anda pasti dapat membuka gulungan satu tingkat lebih, tapi kemudian menjadi berantakan. Jadi, jika Anda tidak mencoba untuk menulis solusi untuk menara hanoi dalam file conf, lebih baik untuk restucture file conf dari menggali YAML atau sesuatu yang lain. Tapi itu panggilan Anda pula.

Komentar

  • Dokumen 453-halaman penuh juga daftar potensi daerah untuk
    konsolidasi, termasuk privatisasi pickup sampah, penggabungan kota dan
    Wayne departemen kesehatan County dan bermitra dengan Sekolah Detroit Publik
    rekreasi. Proposal tidak mencakup ...

  • Seseorang yang akrab dengan kesepakatan itu mengatakan kedua pihak masih hashing yang keluar nama untuk sebuah perusahaan gabungan. Tapi orang ini berkata ide sedang dipertimbangkan adalah pemilihan nama yang tidak memiliki kata "Deutsche" atau singkatan "NYSE" di dalamnya. ...

  • Ya menyebalkan itu tidak menggabungkan rekursif. Saya bisa membuat solusi di perpustakaan balphp saya.

blog komentar powered by Disqus