tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【Mojolicious】Mojoliciousアプリをgenerateして雛形生成するメモ - おまけでplenv x carton x plackup

はじめに

mojoliciousでアプリの雛形を生成するときのメモです。
ゆーすけべーさんのブログをかなり参考にさせていただきました。
PerlのWAFはMojolicious推しな件とそのノウハウAdd

あじぇんだ

  1. mojoliciousいれる
  2. Mojolicious::Liteのアプリの雛形を生成する
  3. Mojoliciousアプリの雛形を生成する
  4. plenv x carton x Mojolicious x plackupでサラっとおさらい

1. mojoliciousいれる

cpanmなんかが入ってれば打つだけですね。

$ cpanm Mojolicious

2. Mojolicious::Liteのアプリの雛形を生成する

Mjolicoius::Liteはお試しで何か作ってみたい場合なんかは重宝しますね。

生成してみる

生成すると1ファイルで完結したアプリが生成されます。

$ cd アプリを置きたいディレクトリ

$ mojo generate lite_app hoge.pl

$ ls -l
-rwxr--r--  1 hoge  1522739515  545  8  9 15:45 hoge.pl
どんなのができるか
#!/usr/bin/env perl
use Mojolicious::Lite;

# Documentation browser under "/perldoc"
plugin 'PODRenderer';

get '/' => sub {
  my $c = shift;
  $c->render(template => 'index');
};

app->start;
__DATA__

@@ index.html.ep
% layout 'default';
% title 'Welcome';
<h1>Welcome to the Mojolicious real-time web framework!</h1>
To learn more, you can browse through the documentation
<%= link_to 'here' => '/perldoc' %>.

@@ layouts/default.html.ep
<!DOCTYPE html>
<html>
  <head><title><%= title %></title></head>
  <body><%= content %></body>
</html>
起動してみる

生成したままmorboコマンドで起動できるのでお手軽!

$ morbo hoge.pl 
Server available at http://127.0.0.1:3000

3. Mojoliciousアプリの雛形を生成する

ある程度のアプリを作成する予定ならMjolicoiusアプリの方を生成します。

まずは普通に

冒頭に参考としてのせたゆーすけべー先生のアプリ構成で生成するのがオススメですが
まずは普通に生成してみます。

生成してみる
$ cd アプリを置きたいディレクトリ

$ mojo generate app Hoge

$ ls -l
drwxr-xr-x   8 hoge  1522739515   272  8  8 19:14 hoge
どんなのができるか

Mjolicoius::Liteと違い、1ファイルではなくフレームワークっぽい構成で生成してくれます。

$ tree ./hoge
./hoge
├── lib
│   ├── Hoge
│   │   └── Controller
│   │       └── Example.pm
│   └── Hoge.pm
├── log
├── public
│   └── index.html
├── script
│   └── hoge
├── t
│   └── basic.t
└── templates
    ├── example
    │   └── welcome.html.ep
    └── layouts
        └── default.html.ep
起動してみる

こちらもmorboコマンドで起動を確認できます。
一見、何を起動するのかわかりずらいですが、上記の構成でいうと./hoge/script/hogeが起動ファイルになっています。

# hogeの一個上の改装からだと
# Can't find application class "Hoge" in @INC
# とclassへのパスが見えないので注意
$ cd ./hoge

$ morbo script/hoge 
Server available at http://127.0.0.1:3000

ブラウザでアクセスしてこんな感じに表示されると思います。

フォルダ構成を工夫する

こちらがゆーすけべー先生のアプリ構成ですね。
非常にいいです。

生成してみる
$ cd アプリを置きたいディレクトリ

# ::Webをつける
$ mojo generate app Fuga::Web

$ ls -l
drwxr-xr-x   8 hoge  1522739515   272  8  9 16:03 fuga_web
どんなのができるか

上記のふつうに生成した場合と見比べてみるとわかりやすいですが、
アプリ名::Webと指定して生成すると./アプリ名_web/lib/アプリ名/Webな感じにディレクトリを切ってくれます。

こうすることで例えばDB系のモジュールを作成する際は
./アプリ名_web/lib/アプリ名/DBのように後からディレクトリを切りやすくなりますね。

tree ./fuga_web/
./fuga_web/
├── lib
│   └── Fuga
│       ├── Web
│       │   └── Controller
│       │       └── Example.pm
│       └── Web.pm
├── log
├── public
│   └── index.html
├── script
│   └── fuga_web
├── t
│   └── basic.t
└── templates
    ├── example
    │   └── welcome.html.ep
    └── layouts
        └── default.html.ep
起動してみる

plackupでの起動もOKです。

$ plackup -p 3000 ./script/fuga_web
HTTP::Server::PSGI: Accepting connections at http://0:3000/

4. plenv x carton x Mojolicious x plackupでサラっとおさらい

plenvやcartonの詳細は書きませんが
plenvからcpanm、cartonからmojoliciousを使いたいときもあるかと思います。

ここまでの流れをplenvでperl 5.18.4入れるところからサラっと書いておさらいします

# plenvでperl5.18.4をインストール
$ plenv install 5.18.4
$ plenv local 5.18.4

# plenv経由でcpanmインストール
$ plenv install-cpanm

# plenv経由でcartonインストール
$ plenv exec cpanm Module::Install
$ plenv exec cpanm Carton

# cpanfile作る&Plackインストール
$ echo "requires 'Task::Plack';" > cpanfile
$ plenv exec carton install

# 念のためrehash
$ plenv rehash

# plackup立ち上げる(アプリがないので怒られるがplackupが動いてればok)
$ carton exec plackup

# cpanfileに追記してMojoliciousのインストール
$ echo "requires 'Mojolicious';" >> cpanfile
$ plenv exec carton install

# mojoliciousアプリのgenerate
$ carton exec mojo generate app Hoge::Web

# mojoliciousアプリの起動
$ carton exec plackup -p 3000 ./script/hoge_web 

こう見ると結構サラっといけますね。

補足

perlbrew、plenv、cartonあたりを入れてみたい場合は下記も参考にしてみてください。

まとめ

mojoliciousはわかりやすくてサラっと入れられるしいろいろ便利です。
Mjolicoius::Liteを使えばさらにライトなのでmock作成するときなんかもサラっといけますね!