― Web Technology and Life ―

【Amon2のオレオレTips】Configのカスタマイズ したい~追記あり~

2012-12-31
configの設定って、githubに上げたくないものがあったり、あるいは、Amon2だと環境別にconfigファイルの設定ができるようになっていたりするけど共通の設定を入れたかったりというのがあって、カスタマイズしたい気がしたりしますよね?そんな気になった時のTipsです。

デフィルトのAmon2のConfigの設定

バージョン3.66現在、Amon2のConfigは、以下のようになっています。

  • Amon2->config()から
  • Amon2->load_config()を呼び出し
  • Amon2::Config::Simple->load()が呼ばれ
  • 環境別のconfig/以下にあるファイル(test.pl,development.pl,depoloyment.plのいづれか)で定義されているhashリファレンスが返され
  • Amon2クラスを継承したクラスのconfigメソッドにキャッシュされる

Configを独自でカスタマイズする方法

独自にカスタマイズする場合は、ドキュメントによるとAmon2を継承したMyAppクラス的なもののload_configメソッドをオーバーライドすればいいようです。

Configに環境に関係ない設定を書きたいときのコード

さて、早速ですが、冒頭で例をあげた環境に関係ない設定をconfigに書きたい場合の設定です。

デフォルトでは、設定ファイルが3つあるので、環境に関係のない設定を書く場合は、同じ内容を3つのファイルに書いていかにも不毛ですね。どうでしょう?そんなときないですか??

私は、そんなことがあるので、config/以下にbase.plというのをおいて、以下のようなload_configのオーバーライドを行なってみました。

package MyApp;
use strict;
use warnings;
use utf8;
use parent qw/Amon2/;
our $VERSION='0.01';
use 5.008001;


#__PACKAGE__->load_plugin(qw//);

sub load_config {
    my $c = shift;

    my $env = $c->mode_name || 'development';

    my $config = +{};
    for my $pl ("base.pl","${env}.pl") {
        my $fname  = File::Spec->catfile($c->base_dir, 'config', $pl);

        my $lconfig = do $fname;
        Carp::croak("$fname: $@") if $@;
        Carp::croak("$fname: $!") unless defined $lconfig;
        unless ( ref($lconfig) eq 'HASH' ) {
            Carp::croak("$fname does not return HashRef.");
        }

        $config = +{%$config,%$lconfig};
    }

    return $config;
}

ちなみに、base.plには、

+{
    #環境別に設定するものも書いておく
    'Teng' => {
        connect_info => [ 'dbi:mysql:db_name;host=127.0.0.1','root','pass' ],
    },
  #環境に関係ない共通の設定
    blog_name => 'hirobanex.net',
};

という感じに、環境に関係ある設定もベースの例みたいのを書いておくとなんとなく親クラス的でわかりやすい気になっています。

【追記:2013-01-03】いただきましたフィードバック

いくつかこんな実装ありますよーと教えて頂きましたので、掲載します。

Config::ENVを使った実装

id:hisaichi5518さんから『Amon2の設定をあれこれ』という記事でご紹介いただきました。Config::ENVは結構わかりやすいモジュールだから、いろんなWAFを使い分けている時に、Config周りを任せるにはもってこいのモジュールですね。結構いいなーと思いました。

Amon2::Config::Simpleで粘る実装

オーサーのtokuhiromさんから、共通設定をする場合は、環境変数別の設定ファイル(test.pl,development.pl,deployment.pl)に、以下のように設定することを想定していると教えていただきました。

use File::Spec;
use File::Basename qw(dirname);
my $basedir = File::Spec->rel2abs(File::Spec->catdir(dirname(__FILE__), '..'));
my $dbpath = File::Spec->catfile($basedir, 'db', 'deployment.db');

my $base = do catfile(dirname(__FILE__), "base.pl");

+{
    %$base,
    'DBI' => [
        "dbi:SQLite:dbname=$dbpath", '', '',
        +{
            sqlite_unicode => 1,
        }
    ],
};

個人的には、config.plみたいなファイルの中で、doしちゃうのは抵抗があるんですが、とりあえず、コードの追いやすいわかりやすい実装ですね。

終わりに

さてさて、みなさんはどんな感じのカスタマイズをされているのでしょうか??いろんな方からフィードバックをいただけてありがたい限りです。オレオレな要件などのツッコミもお待ちしておりますー!

どうにか、年末中に一つ記事をアップできましたwではでは、ツッコミあればどしどしお願いしますー!

Perl update_at : 2013-01-03T18:26:19
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus