Mojoliciousでアプリを開発後、本番運用時に別のパスで運用したい時の為に、prefixを付ける方法を実験してみた
結果からいうとMojolicious::Plugin::Mountを使ったMojolicious::Liteアプリを作成するとよいみたいです。
例では全てPSGIだが他の起動方法でも同じでいいはず
###上手くいった例
script以下の↓こんな感じのコードを準備します。
target_appが作成したアプリの起動スクリプト。
prefix.psgi
#!/usr/bin/env perl
use Mojolicious::Lite;
use Plack::Builder;
use FindBin;
BEGIN {
unshift @INC, "$FindBin::Bin/../lib";
$ENV{MOJO_HOME} ||= "$FindBin::Bin/..";
}
my $prefix = $ENV{MOJO_PREFIX} || "/prefix/";
plugin Mount => { $prefix => app->home->rel_file("target_app") };
get '/' => sub { shift->redirect_to($prefix); };
builder {
require Mojo::Server::PSGI;
Mojo::Server::PSGI->new(app => app)->to_psgi_app;
}
静的ファイルのパスはurl_for()を使う
default.html.ep
<html>
<head>
<meta charset="utf-8" />
<title><%= title %></title>
%# '/js/jquery.js' → url_for('/js/jquery.js')
%= javascript url_for('/js/jquery.js')
%# '/css/main.css' → url_for('/css/main.css')
%= stylesheet url_for('/css/main.css')
</head>
<body>
...
</body>
</html>
javascript
やstylesheet
などのMojoliciousのタグヘルパーは
url_for()を使わないとプレフィックスを補完してくれないので
url_for()を使っておく必要がある
plackupで起動
% plackup script/prefix.psgi
プレフィックスを変更する場合、/other_prefix/
の様に末尾に"/"を付けること
% env MOJO_PREFIX="/other_prefix/" plackup script/prefix.psgi
###ダメだった例
routesにbridgeを準備してアプリのrouteをbridge以下に格納する
Mojolicous_app
my $r = $self->mode eq "production" ? $self->routes->bridge("/prefix") : $self->routes;
$r->get("/")->to("target_ctl#sub1");
...
routeにはprefixが付くが静的ファイルにはprefixが付かない為、上手くいかなかった。