Akihiro's Programmer Blog

Technology Notes for Personal

Amon2のオレオレflavorを作った


 作りました

 Amon2::Setup::Flavor::Aki


背景

  1. 結構Amon2の使い方が固まってきた

  2. amon2-setupしてからやることが大体同じになってきた

  3. そこらへんも勝手にsetupしたいなー

  4. flavor作れば解決するのでは?


作り方

 こちらのサイトと、先人の方々がGithubに上げているflavorのソースコードを参考にしました。

 Amon2 の自作 Flavor 作るの楽しい

 Github


使い方

 完全にオレオレ仕様なので、使う方がいるか分かりませんが一応使い方を書いてみます。


 まずは、取ってきてー

$ git clone https://github.com/akihiro0228/Amon2-Setup-Flavor-Aki.git


インストールしてー

$ cd Amon2::Setup::Flavor::Aki
$ perl Makefile.PL
$ make
$ make install


最後に、setupします

$ amon2-setup.pl --flavor=Aki myApp


機能

 簡単に挙げると以下のような仕様になっています。

  • 全体的にシンプルな構造
  • DBはmysqlを対象
  • DBのpassとかをConfig::Pitで管理
  • DBを簡単setup
  • O/Rマッパーは"Teng"
  • Model機能追加
  • DateTime機能追加
  • auto_render機能追加
  • テスト実行は簡単に


全体的にシンプルな構造

 前に書いた記事を参考にしながらサービス開発に必要なものだけを残していきました。

.
├── app.psgi
├── config
├── cpanfile
├── db
├── lib
├── script
├── static
├── t
└── tmpl


 起動するだけなら

$ carton insall
$ carton exec plackup

でOK


DBはmysqlを対象

 Basic-flavorではSQLiteがデフォルトですが、mysqlを利用することが多いのでそうしています。

 もちろん別途mysqlのinstallをしておく必要があります。


DBのpassとかをConfig::Pitで管理

 DBのpasswordやtwitterAPI key等を設定ファイルにベタ書きすると、github等の公開リポジトリでは管理しづらいです。

 なのでConfig::Pitを使ってパスワード管理をすることにしました。


 まずscript/pit.plを編集します。

use strict;
use warnings;
use Config::Pit;

Config::Pit::set('sample.com', data => {
    database => 'DBI:mysql:sample:localhost:3306',
    username => 'user_name',
    password => 'password',
});

Config::Pit::set('sample.com.test', data => {
    database => 'DBI:mysql:sample_test:localhost:3306',
    username => 'user_name',
    password => 'password',
});

 上が本番&開発用のDB設定。  下がテスト用のDB設定になります。


 usernamepasswordを書いたら実行します。

$ carton exec perl script/pit.pl


 これで設定は~/.pit以下にyaml形式で登録されます。

 後は設定ファイルで読み込んで使います。

use strict;
use warnings;
use Config::Pit;

my $config = pit_get('sample.com', require => {
    'database' => 'hoge',
    'username' => 'hoge',
    'password' => 'hoge',
});

return {
    DB   => [
        $config->{database},
        $config->{username},
        $config->{password},
    ],
};


DBを簡単setup

 セットアップ用スクリプトで一発です。

$ sh script/db_setup.sh


 セットアップされるテーブルのスキーマ構造等はdb以下で設定します。

DROP TABLE IF EXISTS user;

CREATE TABLE IF NOT EXISTS user (
    id          INTEGER     NOT NULL AUTO_INCREMENT,  
    name        VARCHAR(32) NOT NULL                COMMENT "名前",  
    created_at  DATETIME             DEFAULT NULL,
    updated_at  TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE      (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT "ユーザー管理";


O/Rマッパーは"Teng"

 これはBasic-flavorそのままです。


Model機能追加

 以下の記事で実装したものを利用しています。

 Amon2で簡易Modelを作る


 追加としてData::Validatorを使っています。


DateTime機能追加

 Amon2 contextからDateTimeオブジェクトを呼べるようにしました。

# 現在時刻
my $today = $c->dt->now();

# 年月日
$today->year;
$today->month;
$today->day;

# YYYY-mm-dd
$today->ymd;

 こちらを参照しながら使いましょう。

 search.cpan.org DateTime


auto_render機能追加

 renderでtemplateファイルを指定するところを自動で選択するようにしたいと思ったので実装しました。

package sample::Web::App::C::Home;
use strict;
use warnings;
use utf8;

sub index {
    my ($class, $c) = @_;

    # $c->render('app/home/index.tx');
    # さらに
    # 'static/js/app/home/index.js'
    # 'static/css/app/home/index.css'
    # を読み込むようになります
    return $c->auto_render;
}

1;

 これはauto_renderを実行しているモジュールのパッケージ名とメソッド名からpath作っています。


テスト実行は簡単に

 テスト用スクリプトを準備しています。

$ sh script/test.sh


 個別にもテスト実行出来ます。

$ sh script/test.sh t/00_compile.t


最後に

 オレオレflavor作り楽しい。