Penggabungan hash dalam file conf YAML
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
- dogging
- søgemaskineoptimering
- Benjamin "balupton" Lupton



































