Việc sáp nhập băm trong các tập tin conf yaml

31 Tháng Bảy 2009 bởi Thạch Sanh
Nộp theo: công nghệ

YAML là khá tiện dụng để viết các tập tin cấu hình. Chính lợi thế đó, nó đọc tập tin văn bản. Điều này làm việc thực sự tốt nếu tập tin cấu hình của bạn là bằng phẳng (không có hệ thống phân cấp) và không có lần lặp lại.
Nếu tập tin cấu hình của bạn có lặp lại sau đó nó làm cho cảm giác để phân biệt những yếu tố và tái sử dụng chúng. Những gì tôi có nghĩa là chúng ta hãy nói rằng bạn tập tin cấu hình của bạn trông như thế này:

  phát triển:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: your_server
     đăng nhập: your_login
     mật khẩu: top_secret
 sản xuất:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: your_server
     đăng nhập: your_login
     mật khẩu: top_secret 

Giả sử trên mã trong / tmp / test.yml ở đây là làm thế nào bạn có thể đọc trong python, ruby
$cat readyml.py

 # / Usr / bin / env python
 từ pprint nhập khẩu pprint như Trang
 # Trong debian cần phải cài đặt python-yaml
 từ nhập khẩu yaml tải, bãi chứa, load_all
 hash = tải (mở ('/ tmp / test.yml'))
 Trang (hash ['phát triển']) 


$ cat readyml.rb

  # / Usr / bin / env ruby
 yêu cầu 'Trang'
 hash = YAML :: tải (File.open ('/ tmp / test.yml').)
 Trang băm ['phát triển'] 

đây là một tiện dụng lót cho phiên bản ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' hoặc bạn có thể thử trong IRB hoặc giao diện điều khiển python.

Lưu ý rằng trong đoạn mã trên, tất cả mọi thứ khác hơn là đầu ra vị trí tương tự trong phát triển và một phần sản xuất. Đây là nơi định danh nút yml đến để giải thoát. Ý tưởng là đơn giản có một bộ các giá trị mặc định và ghi đè lên tại địa điểm khác nhau.
Bạn có thể kéo nó ra ngoài như sau:

  mặc định: - mặc định
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: người gửi
     smtp_server: your_server
     đăng nhập: your_login
     mật khẩu: top_secret
 phát triển:
   <<: * Mặc định
 sản xuất:
   <<: * Mặc định
   output_location: prod_location 


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

Tuyệt vời, nó hoạt động (tm).
Có thể cho rằng chúng tôi giao dịch ở một số rõ ràng cho một chút ma thuật. Đây là một lời giải thích nhỏ: &, và <<: & là anchor thẻ có thể được hiểu như là định danh nút, * là nút tham chiếu và <<: là viết tắt của hợp nhất băm.

Để biết thêm chi tiết xem một trong hai thông số kỹ thuật yaml hoặc wikipedia
Cho đến nay rất tốt nhưng có một nắm bắt ở đây, những sáp nhập băm không phải là đệ quy. Nó có nghĩa là: chúng ta hãy nói rằng bạn muốn có tên người gửi thư trong hai môi trường khác nhau, bạn có thể bị cám dỗ để làm như sau:

  mặc định: - mặc định
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: người gửi
     smtp_server: your_server
     đăng nhập: your_login
     mật khẩu: top_secret
 phát triển:
   <<: * Mặc định
   mail:
     SENDER_NAME: sender_dev
 sản xuất:
   <<: * Mặc định
   output_location: prod_location
   mail:
     SENDER_NAME: sender_prod 

Cho phép kiểm tra

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

Rất tiếc, một cái gì đó đã đi sai, vấn đề như đã đề cập ở trên là hợp nhất hash không phải là đệ quy và khi hợp nhất nó thay thế thư mặc định của thư sản xuất mà chỉ có một chìa khóa. Giải pháp / công trình xung quanh là cuộn thêm một cấp độ:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  SENDER_NAME: người gửi
   smtp_server: your_server
   đăng nhập: your_login
   mật khẩu: top_secret

 mặc định: - mặc định
   <<: * Common_settings
   mail:
     <<: * Mail_defaults
 phát triển:
   <<: * Mặc định
 sản xuất:
   <<: * Mặc định
   mail:
     <<: * Mail_defaults
     SENDER_NAME: sender_prod

Cho phép kiểm tra lại

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

Bạn có nói rằng bạn có thêm một mức độ làm tổ, bạn có thể chắc chắn cuộn thêm một cấp nữa, nhưng sau đó nó trở thành một mớ hỗn độn. Vì vậy, nếu bạn không cố gắng để viết giải pháp cho tháp Hà Nội trong một tập tin conf, nó là tốt hơn để restucture tập tin conf hơn đào vào yaml hay cái gì khác. Nhưng đó là cuộc gọi của bạn anyway.

Bình luận

  • 453 trang tài liệu cũng liệt kê các khu vực tiềm năng
    hợp nhất, bao gồm cả tư nhân lấy thùng rác, sáp nhập thành phố và
    Wayne County sở y tế và quan hệ đối tác với các Trường Công Detroit
    vui chơi giải trí. Đề nghị không bao gồm bất kỳ ...

  • Một người quen thuộc với thỏa thuận này cho biết hai bên vẫn được băm ra một tên cho một công ty nhận sáp nhập. Nhưng người này cho biết một ý tưởng đang được xem xét là việc lựa chọn một tên mà không có từ "Deutsche" hoặc viết tắt "NYSE" trong đó. ...

  • Vâng gây phiền nhiễu nó không hợp nhất đệ quy. Tôi đã có thể làm cho một workaround trong thư viện balphp của tôi.

- bởi Disqus