Perl (Mojolicious) を使って web アプリ開発に挑戦 (第9回その1)
第9章 新しい機能を追加する(その1)
前回までで一通りの機能の切り離しはおわりました。 実際にアプリを運用段階になると本番公開環境と開発環境と、のように 実行環境を分けたいことがあります。 そういう時のためにアプリケーション用の設定ファイルを用意しておくと便利です。
9.1 設定ファイルを導入
今回は公開環境、開発環境、テストコード環境の3つということにします。
9.1.1 設定ファイルの種類を考える
設定について
- 下記のような名前で環境ごとの条件を設定
- 公開環境 -> `production`
- 開発環境 -> `development`
- テストコード環境 -> `testing`
例として今回は下記のようなファイル構成としたい
beginning_mojo # Application directory ... |- etc # 設定ファイル | +- beginning_mojo.common.conf # 共通設定ファイル | +- beginning_mojo.development.conf # 開発環境の設定ファイル | +- beginning_mojo.production.conf # 公開環境の設定ファイル | +- beginning_mojo.testing.conf # テストコード環境の設定ファイル ...
9.1.2 設定ファイルを用意する
下記のような内容のファイルを作成
% touch etc/beginning_mojo.common.conf % touch etc/beginning_mojo.development.conf % touch etc/beginning_mojo.production.conf % touch etc/beginning_mojo.testing.conf
設定ファイルは Perl のハッシュ形式で記述
etc/beginning_mojo.common.conf
+{
schema_file => app->home->child('db', 'bulletin.sql')->to_string,
db_file => app->home->child('db', 'bulletin.db')->to_string,
mode => app->mode,
};
etc/beginning_mojo.development.conf
+{};
etc/beginning_mojo.production.conf
+{};
etc/beginning_mojo.testing.conf
+{
db_file => app->home->child('db', 'bulletin.testing.db')->to_string,
};
9.1.3 アプリケーションに設定する
設定ファイルを読み込むための調整をしていきます。
lib/BeginningMojo.pm
# ...
sub startup {
my $self = shift;
my $mode = $self->mode;
my $moniker = $self->moniker;
my $home = $self->home;
my $common = $home->child( 'etc', "$moniker.common.conf" )->to_string;
my $conf = $home->child( 'etc', "$moniker.$mode.conf" )->to_string;
# 設定ファイル (読み込む順番に注意)
$self->plugin( Config => +{ file => $common } );
$self->plugin( Config => +{ file => $conf } );
my $config = $self->config;
$self->helper(
model => sub { BeginningMojo::Model->new( conf => $config ); } );
$self->helper(
teng => sub { BeginningMojo::Model->new( conf => $config )->teng; } );
# ...
}
1;
lib/BeginningMojo/Model.pm
# ...
has bulletin =>
sub { BeginningMojo::Model::Bulletin->new( conf => shift->conf ); };
# ...
設定ファイルの読み込みに変更
lib/Test/Mojo/Role/Basic.pm
# ...
sub init_db {
my $self = shift;
# データベースの初期化間違いを防止
die 'not mode testing!' if $self->app->config->{mode} ne 'testing';
my $db = $self->app->config->{db_file};
my $schema = $self->app->config->{schema_file};
# ...
}
# ...
lib/BeginningMojo/Model/Base.pm
# ...
has [qw{req_params conf}];
# 全てのモデルで共通して使えるメソッドを定義
sub teng {
my $self = shift;
my $dsn_str = 'dbi:SQLite:' . $self->conf->{db_file};
my $user = '';
my $pass = '';
my $option = +{
RaiseError => 1,
PrintError => 0,
AutoCommit => 1,
sqlite_unicode => 1,
};
# ...
}
1;
テストコードを実行、エラーが出ることに注意
% docker-compose exec web carton exec -- prove --lib t/bulletin.t .. not mode testing! at /Users/yk/github/sakura_developers/beginning_mojo/lib/Test/Mojo/Role/Basic.pm line 20. ...
9.1.4 環境変数の設定について
MODE については下記のような挙動になっている
- MODEについての注意
- `app->mode`メソッドは環境変数`MOJO_MODE`で判定している
- アプリケーションの実行
- morbo コマンドは標準で`development`で実行している
- 実行コマンド実行時に任意に環境変数`MOJO_MODE`に指定すると変更になる
- テストコードの実行
- prove コマンドで実行するのはテストコード
- テストコード内でアプリのスクリプトを読み込む前に環境変数`MOJO_MODE`に指定すると変更になる
docker-compose.yml
...
environment:
MOJO_MODE: '${MOJO_MODE-}'
command: '${BULLETIN_COMMNAD_FILE-./bin/compose-cmd.bash}'
...
docker-compose 起動時に読み込む環境設定ファイルを用意
% touch etc/.env.development % touch etc/.env.production
etc/.env.test
BULLETIN_COMMNAD_FILE="./bin/compose-cmd-test.bash" MOJO_MODE="testing"
etc/.env.development
MOJO_MODE="development"
etc/.env.production
MOJO_MODE="production"
ここまできてテストコードを起動するときの方法がふたつになる
(テストコード実行、アプリケーションが実行されている状態で別のウインドウから) % docker-compose exec --env MOJO_MODE=testing web carton exec -- prove --lib (テストコード実行、アプリケーションが実行されていない状態で) % docker-compose --env-file ./etc/.env.test up
以降はテストコード実行時にモード指定するので修正
lib/Test/Mojo/Role/Basic.pm
# ...
sub init {
my $self = shift;
# テストコード実行の制限
die 'not mode testing!' if $self->app->config->{mode} ne 'testing';
$self->init_db;
return;
}
# ...
9.1.5 まとめ
- 今回の内容は下記の github 参考資料でみれます。
- https://github.com/Becom-Developer/beginning-mojo/tree/master/chapter9/section1
9.1.6 次回
今回は環境設定まわりをととのえました。
次回はデータベースロジックを拡張するやり方をやってみたいと思います。

コメント
0 件のコメント :
コメントを投稿