プログラムを書いていて、設定ファイルを別にしている人は多いと思うんだけど、設定ファイルが大きくなったときに中身がカオスになってしまう事ってありますね。そんなときに、「コンフィグファイルを目的別に分割したい」って思うことがあるよね。
例えばこんな感じ。
config/ |-- myapp.yml |-- myapp_database.yml |-- myapp_local.yml |-- web_myapp_log.yml `-- web_myapp_local.yml
これを読み込んで内容をマージしてくれるモジュールが Config::Multi。つい最近出来たばっかりのモジュールです。
使い方はこんな感じです。(SYNOPSIS から引用)
use Config::Multi; use File::Spec; use FindBin; my $dir = File::Spec->catfile( $FindBin::Bin , 'conf' ); # prefix and extension is optional. my $cm = Config::Multi->new({ dir => $dir , app_name => 'myapp' , extension => 'yml' }); my $config = $cm->load(); my $loaded_config_files = $cm->files;
それぞれの引数は、
- dir には設定ファイルが格納されている path
- app_name にアプリケーションの名前
- extention は拡張子
です。
これで、以下のような構成が読み込めます。
conf/
|-- myapp.yml
|-- myapp_database.yml
|-- myapp_log.yml
|-- myapp_local.yml
`-- never_load.yml
${app_name}.yml か、 ${app_name}_*.yml を読み込むので、never_load.yml は読み込まれません。
また、_local とついたファイルは、一番最後に読み込んで上書きするようになってます。
本番環境と開発環境で分けたい時に便利ですね。
また、new したときに prefix って引数を付けると任意のグループが読み込めます。
conf/ |-- myapp.yml |-- myapp_database.yml |-- myapp_log.yml |-- myapp_local.yml |-- mobile_myapp.yml |-- mobile_myapp_log.yml |-- mobile_myapp_validator.yml |-- mobile_myapp_local.yml |-- web_myapp.yml |-- web_myapp_log.yml |-- web_myapp_validator.yml `-- web_myapp_local.yml
mobile と web という prefix があるのが分かりますか。
では、web という prefix を指定してみましょう。
my $cm = Config::Multi->new({ dir => $dir , prefix => 'web', app_name => 'myapp', extension => 'yml' });
これで、myapp.yml, myapp_*.yml, web_myapp.yml, web_myapp_*.yml が読み込まれて、mobile_* は読み込まれなくなりました。
携帯サイトと PC サイトで設定ファイルを一部共有したいと言った場面で役立ちますね!
また、環境変数による読み込み振り分けも出来ます。詳しくは POD を見てみてね!
おっと、もし Catalyst を使っているなら、Catalyst::Plugin::Config::Multi っていう Plugin になってるから使うといいよ!



Leave a comment