« Plack::App::Directory::Markdownが便利な件 | メイン | Plack::App::Directory::Markdownその後 »

2012年8月28日

Plack::App::DataSection is released!

ちょっとしたpsgiアプリを公開するときに、画面の体裁をCSS等で軽く整えたいと思うことがあると思います。そういう時に静的ファイルをどのように配信するかが悩ましいところです。

そこで、ディレクトリの中身をモジュールファイルのDataSctionにpackしてそれを簡単にpsgiアプリとして使えるようにPlack::App::DataSectionというものを公開しました。

使い方は簡単です。cpanmした後、以下の様なファイルを準備してください。

package MyApp;
use strict;
use warnings;
use parent 'Plack::App::DataSection';
1;
__DATA__
@@ index.txt
あいうえお

このファイルを保存すれば以下のように利用可能です。簡単ですね。

% plackup -MMyApp -e 'MyApp->new->to_app' &
% curl http://localhost:5000/index.txt
あいうえお

もちろん、このようなファイルをちまちま作るのは現実的じゃないので、生成するスクリプトを用意しています。以下のようにすれば、ディレクトリの内容をモジュールへとpackしてくれます。

% dir2data-section.pl --dir=static/ --module=MyApp

バイナリはbase64形式でDataSectionに突っ込むようになっているので、画像も配信できます。

MyApp->new->dump_dir('static');

などとすれば、ディレクトリに書き戻すこともできるので、ちょっとしたひな形作成にも使えるかもしれません。

Plack::App::Directory::Markdown::Staticで利用しているので、中身を見てもらえればどういうことをしているかが分かると思います。jQury, Twitter Bootastrap, Google code prettify等の静的ファイルをガツっとpackしています。

それを、Plack::BuilderをつかってmountしてやることでJS,CSS等のファイル配信を実現しています。以下、Plack::App::Directory::Markdownから引用。

sub to_app {
    my $self = shift;

    my $app = $self->SUPER::to_app;
    my $static_app = Plack::App::Directory::Markdown::Static->new->to_app;

    builder {
        mount '/_static' => $static_app,
        mount '/'        => $app,
    };
}

ちなみに、MIME typeからバイナリ判定をしているis_binaryメソッドが適当な感じなので、何か良いモジュールがあれば使いたいところだけど、ニーズが無さそうな割にはメンテナンスがめんどくさそうなので自分では書きたくない。

投稿者 Songmu : 2012年8月28日 00:22