2009-03-15 11 views
5

Nếu tôi có dự án Greenfield, mô hình cấu hình dựa trên Perl tốt nhất để sử dụng là gì?Mô-đun Perl tốt nhất cho cấu hình phân cấp và kế thừa là gì?

Sẽ có ứng dụng Catalyst và một số tập lệnh dòng lệnh. Họ nên chia sẻ cùng một cấu hình.

Một số tính năng tôi nghĩ mình muốn ...

Cấu hình phân cấp để duy trì rõ ràng các cài đặt phát triển và sống khác nhau.

Tôi muốn xác định cấu hình "chung" một lần (ví dụ: results_per_page => 20), có những cấu hình được kế thừa nhưng có thể ghi đè bởi các cấu hình dev/live của tôi.

Global: 
    results_per_page: 20 
    db_dsn: DBI:mysql; 
    db_name: my_app 
Dev: 
    inherit_from: Global 
    db_user: dev 
    db_pass: dev 
Dev_New_Feature_Branch: 
    inherit_from: Dev 
    db_name: my_app_new_feature 
Live: 
    inherit_from: Global 
    db_user: live 
    db_pass: secure 

Khi tôi triển khai dự án sang máy chủ mới, hoặc chia nhánh/sao chép nó ở đâu đó mới (ví dụ: cá thể phát triển mới), tôi muốn (chỉ một lần) đặt tập/tập cấu hình nào sử dụng, và sau đó tất cả các bản cập nhật trong tương lai đều tự động.

tôi cho rằng điều này có thể đạt được với một liên kết tượng trưng:

git clone example.com:/var/git/my_project . # or any equiv vcs 
cd my_project/etc 
ln -s live.config to_use.config 

Sau đó, trong tương lai

git pull # or any equiv vcs 

Tôi cũng thích một cái gì đó giống như FindBin, do đó configs tôi có thể hoặc sử dụng đường dẫn tuyệt đối hoặc tương đối so với triển khai hiện tại. Với

/home/me/development/project/ 
    bin 
    lib 
    etc/config 

nơi/home/me/phát triển/dự án/etc/config chứa:

tmpl_dir: templates/ 

khi mã perl tôi nhìn lên cấu hình tmpl_dir nó sẽ nhận được:

/home/me/development/project/templates/ 

Nhưng về triển khai trực tiếp:

/var/www/project/ 
    bin 
    lib 
    etc/config 

Cùng mã kỳ diệu sẽ trở

/var/www/project/templates/ 

giá trị tuyệt đối trong cấu hình nên được vinh danh, do đó:

apache_config: /etc/apache2/httpd.conf 

sẽ quay trở lại "/etc/apache2/httpd.conf" trong mọi trường hợp.

Thay vì cách tiếp cận kiểu FindBin, một giải pháp thay thế có thể là cho phép xác định giá trị cấu hình theo các giá trị cấu hình khác?

tmpl_dir: $base_dir/templates 

Tôi cũng thích một con ngựa;)

Trả lời

9

Catalyst::Plugin::ConfigLoader hỗ trợ nhiều file config trọng. Nếu ứng dụng Catalyst của bạn được gọi là MyApp, thì có ba mức ghi đè: 1) MyApp.pm có thể có chỉ thị __PACKAGE__->config(...), 2) tiếp theo sẽ tìm MyApp.yml trong thư mục chính của ứng dụng, 3) sẽ tìm kiếm MyApp_local.yml. Mỗi cấp độ có thể ghi đè cài đặt ở mỗi cấp độ khác.

Trong một ứng dụng Catalyst tôi đã xây dựng, tôi đặt tất cả các thiết lập bất biến của tôi trong MyApp.pm, cài đặt gỡ lỗi của tôi trong MyApp.yml, và các thiết lập sản xuất của tôi trong MyApp_<servertype>.yml và sau đó symlinked MyApp_local.yml để trỏ vào MyApp_<servertype>.yml trên mỗi máy chủ được triển khai (tất cả họ đều một ít khác nhau...).

Bằng cách đó, tất cả cấu hình của tôi đều nằm trong SVN và tôi chỉ cần một bước ln -s để định cấu hình máy chủ theo cách thủ công.

6

Perl Best Practices cảnh báo chính xác những gì bạn muốn. Nó nói rằng tập tin cấu hình nên được đơn giản và tránh các loại tính năng baroque bạn mong muốn. Nó tiếp tục đề xuất ba mô-đun (không có trong số đó là Core Perl): Config::General, Config::StdConfig::Tiny.

Lý do chung đằng sau điều này là việc chỉnh sửa các tệp cấu hình có xu hướng được thực hiện bởi những người không lập trình và phức tạp hơn bạn tạo các tệp cấu hình của mình, càng có nhiều khả năng họ sẽ sửa chúng.

Tất cả điều đó đều cho biết, bạn có thể xem YAML. Nó cung cấp đầy đủ tính năng, có thể đọc được, có thể đọc được *, định dạng tuần tự. Tôi tin rằng trình phân tích cú pháp hiện tại trong Perl là YAML::XS. Nếu bạn đi tuyến đường này, tôi khuyên bạn nên viết một công cụ cấu hình để người dùng cuối sử dụng thay vì yêu cầu họ chỉnh sửa trực tiếp các tệp.

ETA: Dựa trên câu trả lời của Chris Dolan, có vẻ như YAML là cách để giúp bạn vì Catalyst đã sử dụng nó (.yml là phần mở rộng trên thực tế cho các tệp YAML).

* Tôi đã nghe khiếu nại mà người mù có thể gặp khó khăn với nó

2

YAML là hận thù đối với cấu hình - nó không phải là lập trình viên không thân thiện một phần vì yaml trong pod là theo định nghĩa phá vỡ khi họ đang cả hai màu trắng-không gian phụ thuộc theo nhiều cách khác nhau. This giải quyết vấn đề chính với Config :: General. Tôi đã viết một số tập tin cấu hình khá phức tạp với C :: G trong quá khứ và nó thực sự giữ trên con đường của bạn về yêu cầu cú pháp vv Khác hơn, lời khuyên của Chris dường như trên tiền.