動くところまで

※2010.10.22 追記
この記事には、いろいろ勘違いした内容が含まれています。
比較的正しい(かもしれない)内容をご希望の方は、改訂版のページをご覧ください。

Mojolicious::Liteで遊んでいます。

さて、Mojoliciousを取り巻く環境も(自分なりに)理解でき、気持ちも落ち着かせる事ができました。それでは早速、Mojolicious::Liteを動かしてみたいと思います。

尚、以下のサイトを参考とさせて頂きました。

このサイトからMojolicious-latest.tar.gzをダウンロードして展開すると、細かいバージョン名がついたフォルダができます。中身を見てみると、以下のようになっていました。まぁ、実はこれ以外にもREADMEファイルとかあるのですが、省略しています。

/lib/
/script/
/t/

このうち、libディレクトリはMojoliciousのモジュールが格納されています。CakePHPのcakeディレクトリみたいなものですかね。基本的にはここをいじる事はないでしょう。

tディレクトリは、テスト用のコードが格納されている、みたいです。“みたいです”というのは、私がこれの役割をよく解っていないからです。

最後のscriptディレクトリには、mojoとmojoliciousという二つのコマンドが格納されています。Mojolicious::LiteでWebサイトを構築するには、mojoliciousコマンドを使うのが手軽、なのだと思います。いや、CakePHPのbakeコマンドほどバシバシとファイルを作ってくれたりする訳じゃないんですけど、それでも一通りのファイルを自動的に用意してくれるので、やっぱり楽なんだと思いますよ。

というわけで、これより私が自前マシンに環境を構築した際の手順を記述します。これは、あくまで私が実行した手順であり、もっと素晴らしいやり方があるかもしれません(っていうか、あるよね、きっと)ので、まぁ、参考とか反面教師とか、そういう感じに受け取ってもらえればと思います。

まず、以下のような構成でセットアップすることにします。

DocumentRoot/mojolicious/     # ここにセットアップする。

http://localhost/mojolicious/ # ブラウザでアクセスする際のURL

Webサーバはローカル環境のApache2、mod_rewriteを有効化。

mojoliciousディレクトリにMojoliciousのファイルを格納します。

DocumentRoot/mojolicious/lib/
DocumentRoot/mojolicious/script/
DocumentRoot/mojolicious/t/

シェルでmojoliciousディレクトリへ移動して、script/mojoliciousコマンドを実行します。

./script/mojolicious generate app myapp

すると、mojoliciousディレクトリにmyappディレクトリが生成され、その中に幾つかのファイルが格納されました。この段階のmojoliciousディレクトリの構成は以下のようになっています。

DocumentRoot/mojolicious/lib/
DocumentRoot/mojolicious/myapp/
DocumentRoot/mojolicious/script/
DocumentRoot/mojolicious/t/

このmyappディレクトリ以下のファイルが、今回作成するWebアプリケーションの為のファイルとなります。でもまぁ折角なので、mojolicious/index.cgiで起動できるようにします。

cp ./myapp/script/myapp ./index.cgi

そして、index.cgiファイルを編集します。index.cgiは以下のような内容でした。

#!/usr/bin/env perl

use strict;
use warnings;

use File::Basename 'dirname';
use File::Spec;

use lib join '/', File::Spec->splitdir(dirname(__FILE__)), 'lib';
use lib join '/', File::Spec->splitdir(dirname(__FILE__)), '..', 'lib';

# Check if Mojo is installed
eval 'use Mojolicious::Commands';
die <<EOF if $@;
It looks like you don't have the Mojo Framework installed.
Please visit http://mojolicious.org for detailed installation instructions.

EOF

# Application
$ENV{MOJO_APP} ||= 'Myapp';

# Start commands
Mojolicious::Commands->start;

先ずは、読み込むモジュールPATHを設定します。

# こうなっているのを・・・
use lib join '/', File::Spec->splitdir(dirname(__FILE__)), 'lib';
use lib join '/', File::Spec->splitdir(dirname(__FILE__)), '..', 'lib';

# こう書き換える
use lib join '/', File::Spec->splitdir(dirname(__FILE__)), 'lib';
use lib join '/', File::Spec->splitdir(dirname(__FILE__)), 'myapp', 'lib';

要は、Mojoliciousのlibディレクトリと生成したプロジェクトのlibディレクトリへのPATHが通っていれば良いようです。

次に、CGIで動作するよう指定します。

# これを
Mojolicious::Commands->start;

# こうする
Mojolicious::Commands->start('CGI');

Mojoliciousは自動的にCGIなのかmod_perlなのか判別してくれるとのことですが、念の為明示しておきました。

これで、Webブラウザよりhttp://localhost/mojolicious/index.cgiへアクセスすると、“Welcome to the Mojolicious Web Framework!”というメッセージが表示されるはずです。

しかし、http://localhost/mojolicious/index.cgiへアクセスするとWelcomeメッセージが表示されますが、http://localhost/mojolicious/へのアクセスでは上手く表示がされません。ついでといっては何ですが、index.cgiを省略しても正常に動作するように、mod_rewriteで処理させてみます。手元のWordPressが生成してくれた.htaccessファイルを元に、以下のようなファイルを作成しました。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /mojolicious
RewriteRule ^$ index\.cgi/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)$ index\.cgi/$1 [L]
</IfModule>

・・・いや、この記述で正しいのか不安なのですが、ひとまず無事にhttp://localhost/mojolicious/でも動作してますので、とりあえず良しとしましょう。

正直、いろいろと手を加えなければならない感じがして面倒ではありますが、慣れればどうってことない作業ですし、ファイル構成とか自由にできると見ることもできますね。

今日の所は、ここまでにしときます。