« Perl QA Hackathon 2013 Satellite at Tokyoに行ってきた話 | メイン | 3分でpull request »

2013年5月 4日

Config::PLというのを書きました

https://metacpan.org/module/Config::PL

.plファイルを設定ファイルとして使う時のユーティリティです。以下の様な感じで使えます。

use Config::PL;
my $config = config_do 'config.pl';

do 'config.pl'のハマりどころや不便な点を解消しています。doの問題点は具体的には以下の様な点。

  1. config.plにsyntax errorがあってもエラーにならない
  2. 絶対パスで指定しないと危ない。doはモジュール読み込みと同じルールでファイルを探しに行くので、@INCを探しにいってしまう。config.plが@INCに置かれているとそっちが優先的に呼ばれる(!)
  3. config.plから他のファイルを相対パスで読み込めない

これらに対してConfig::PLは、

  1. syntax errorやhashrefを返していない場合にエラーになる
  2. @INCをlocalizeして、cwdとそのファイル自身がおいてあるディレクトリしか探さない
  3. そのファイル自身が置いてあるディレクトリをlocalizeした@INCに含むので、相対パスで読み込み可能

というようになっています。

設定ファイルが置いてあるディレクトリで、同じディレクトリにある他のファイルを環境変数に応じて読み込みたい時なんかに便利で、

以下の様な構成になっている時に、

[songmu@localhost]$ ls config
common.pl  development.pl  production.pl  test.pl

例えばこのような感じで環境変数に応じた設定の切り替えが可能です。

# config/common.pl
use Config::PL;
config_do "$ENV{PLACK_ENV}.pl";

以下のように書くよりわかりやすくていいんじゃないかと思います。

use File::Spec;
use File::Basename;
do File::Spec->catfile(File::Basename::dirname(__FILE__), "$EVN{PLACK_ENV}.pl")

環境変数に応じた設定に切り替えに関しては@cho45氏のConfig::ENVが非常に便利ですが、Config::ENVの作法を覚えないといけなかったりするので、もう少し通常の作法に近い解決方法をサポートしようと思い、書いてみました。普段使っているArkが、config(?:_local)?.pl 決め打ちだってのもあります。

同様のモジュールとして、これもまた@cho45氏のConfig::Doってのがありましたが、これはconfig.plにエラーがあった場合ににエラー終了することを保証するもので、Config::PLのように@INCをlocalizeするようなお節介をしないところが異なります。

依存もないので簡単にお使いいただけます。お試しください。

投稿者 Songmu : 2013年5月 4日 11:54