2009-03-15 6 views
5

greenfield 프로젝트가 있다면 Perl 기반 구성 모듈을 사용하는 가장 좋은 방법은 무엇입니까?계층 적 및 상속 가능한 구성을위한 최고의 Perl 모듈은 무엇입니까?

Catalyst 응용 프로그램과 일부 명령 줄 스크립트가 있습니다. 그들은 동일한 구성을 공유해야합니다.

내가 원하는 생각하는 일부 기능 ...

계층 구성은 완전히 다른 개발 및 라이브 설정을 유지합니다.

"글로벌"구성을 한 번 정의 (예 : results_per_page => 20)하고 싶습니다. 상속되지만 내 구성/구성에 의해 오버라이드 할 수 있습니다.

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 

나는 새로운 서버 또는 지점/포크 /에 프로젝트를 배포

는, 내가 (예를 들어, 새로운 개발 인스턴스) 새로운 곳으로 원하는 복사 (1 회에 한함) 설정하는 구성 집합/파일에 사용하고 이후의 모든 업데이트는 자동으로 수행됩니다.

내가 이것을 직시 줄은 심볼릭 링크로 달성 될 수있다 : 미래

git pull # or any equiv vcs 

에 그런

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

I 좋겠 또한 뭔가 같은 FindBin 유사 그, 그래서 내 CONFIGS 수 절대 경로를 사용하거나 현재 배포와 관련이 있습니다. 내 펄 코드는 tmpl_dir 구성을 보이는 경우

tmpl_dir: templates/ 

은 얻을 것이다 :/홈/ME/개발/프로젝트/등은/설정이 포함

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

을 감안할 때

/home/me/development/project/templates/ 

하지만 실시간 배포시 :

/var/www/project/ 
    bin 
    lib 
    etc/config 
apache_config: /etc/apache2/httpd.conf 

이 모든 경우에 "/etc/apache2/httpd.conf"를 반환 : 있도록동일한 코드 마술, 영광해야하는 설정에

/var/www/project/templates/ 

절대 값을 반환합니다.

FindBin 스타일 방식이 아니라 다른 구성 값으로 구성 값을 정의 할 수있는 대안이있을 수 있습니까?

tmpl_dir: $base_dir/templates 

나는 또한 조랑말 싶습니다;

답변

9

Catalyst::Plugin::ConfigLoader 여러 최우선 설정 파일을 지원합니다). 촉매 응용 프로그램이 MyApp이라면 1) MyApp.pm__PACKAGE__->config(...) 지시어를 가질 수 있습니다. 2) 다음으로 응용 프로그램의 기본 디렉토리에서 MyApp.yml을 찾습니다. 3) MyApp_local.yml을 찾습니다. 각 레벨은 서로 다른 레벨의 설정을 무시할 수 있습니다.내가 만든 촉매 응용 프로그램에서

, 그때 내 디버그 설정 MyApp.yml, 그리고 MyApp_<servertype>.yml 내 생산 설정, MyApp.pm 내 불변의 모든 설정을 넣어가 배포 된 각 서버에 MyApp_<servertype>.yml 가리 키도록 MyApp_local.yml을 심볼릭 링크 (그들이 있었다 모두 조금 다른 ...).

그런 식으로 모든 설정은 SVN에 있었고 수동으로 서버를 설정하려면 ln -s 단계가 필요했습니다.

6

Perl Best Practices은 원하는 것을 정확히 경고합니다. 설정 파일은 단순해야하며 원하는 바로크 식 기능을 피해야한다고 명시되어 있습니다. 그것은 세 모듈 (어느 것도 Core Perl이 아닙니다) : Config::General, Config::StdConfig::Tiny을 추천합니다.

일반적인 이유는 설정 파일을 편집하는 것이 프로그래머가 아닌 사람이하는 경향이 있고 구성 파일을 복잡하게 만들수록 더 복잡해지기 때문입니다.

모든 내용은 YAML입니다. 이것은 완전한 기능을 갖춘 사람이 읽을 수있는 *, 직렬화 형식을 제공합니다. 현재 Perl의 권장 파서는 YAML::XS이라고 생각합니다. 이 경로를 사용하는 경우 최종 사용자가 파일을 직접 편집하는 대신 구성 도구를 작성하여 사용하는 것이 좋습니다.

ETA : Chris Dolan의 답변에 따르면 Catalyst가 이미 그것을 사용하고 있기 때문에 YAML이 당신을 위해 갈 방법입니다 (.yml은 사실상 YAML 파일의 확장입니다).

* 나는 들었다 사람들이

2

YAML이 설정에 대한 증오입니다 그것으로 어려움이있을 수 있습니다 장님 불만 - 그것은 포드 YAML은 정의하기 때문에 그들이 공백 모두있는 한 부분적으로 깨진 친절하지 않은 프로그래머의 서로 다른 방식으로 This은 Config :: General의 주요 문제점을 해결합니다. 과거에 C :: G와 함께 꽤 복잡한 설정 파일을 작성했고, 구문 요구 사항 등의 측면에서 여러분의 방식을 실제로 유지하고 있습니다. 그 외, Chris의 조언은 돈으로 생각됩니다.