Debuginfo

思考とアウトプット

初めてのCarton + Mojolicious

Deployを容易にしてくれるCarton使ってみます。(Need to note that the carton is not fully production but it doesn’t matter for my joke app :) ) いつかはHerokuにデプロイしてみたいです。

$ cpanm carton
$ vi Makefile.PL
$ cat Makefile.PL 
use inc::Module::Install;
name 'knowhow3';
version '0.1';

requires 'Mojolicious', 3.84;

WriteAll;

まずMojoliciousを入れてみます。

$ carton install
Installing modules using Makefile.PL
Usage: cpanm [options] Module [...]

Try `cpanm --help` or `man cpanm` for more options.

I nstalling modules failed

エラーがでました。ググると Module::Installが必要のようで。

$ cpanm Module::Install

の後にcarton installはうまくいきました。

 $ ls META.yml MYMETA.json MYMETA.yml Makefile Makefile.PL
carton.lock inc local

次にMojolicious appを作成。

$  carton exec -- mojo generate app Knowhow3

現在のディレクトリにknowhow3ができてその中にMojolicious app用のディレクトリ、ファイルが作成されます。私の環境では階層を深くする必要なないのでknowhow3ディレクトリはいらない。全部version以下にもってきます。

$ mv knowhow3/* .
$ rmdir knowhow3
$ ls
carton.lock  inc  lib  local  log  ls  Makefile  Makefile.PL  META.yml  MYMETA.json  MYMETA.yml  public  script  t  templates

沢山ファイルがあって開発してる感じがジワジワでてきました。 起動確認してみます。(lib,script,log,templates,public,tはMojoliciousのもの)

$ carton exec — ./script/knowhow3 daemon

127.0.0.1:3000にアクセスできるか確認。動いてる!

Plackupできるようにする

Plack::Middlewareを将来的に使えるようにしときます。

$ vi Makefile.PL
# add the below line
requires 'Plack', 1.0016;
requires 'Plack::Middleware::Session', 0.15;
$ carton install

psgiを作る。ぐぐって色々なサイトを参考にしました。

# knowhow3.psgi
use Mojo::Server::PSGI;
use Plack::Builder;
use FindBin qw($Bin);
use lib "$Bin/../lib";
use Knowhow3;

my $psgi = Mojo::Server::PSGI->new( app => Knowhow3->new );
my $app = sub { $psgi->run(@_) };

builder {
    enable 'Session', store => 'File';
    $app;
};

Plackupで上がるか確認。”Welcome to ...” が http://localhost:5000でアクセスできるか確認する。”Your Mojo Working”はtemplate等が読み込まれていないくてWorkingしてないので注意。

$ carton exec -- plackup ./script/knowhow3.psgi 

Mojolicousの階層構造を整える

$ tree lib
lib
|-- Knowhow3
|   |-- API
|   |-- Controller
|   |   `-- Example.pm
|   |-- DB
|   |   `-- Schema.pm
|   |-- Model.pm
|   `-- Role
`-- Knowhow3.pm

Controllerのパスを変える。

# in lib/Knowhow3.pm

#$r->namespace('Knowhow3::Controller');  <- it seems it’s depreciated
push @{$r->namespaces}, ‘Knowhow3::Controller';

Proveやスクリプトもcarton execで走らせるのを忘れないようにしとけばオッケー。 Cartonのおかけで将来あるであろうMigrationが楽しみです:D