Blog::kobaken

prove t/foo/bar/baz.t

About Dancer2 (ja)

この記事は、Perl5 Advent Calendar 2015 の20日目の記事です。

Web Application Framework の Dancer2 について紹介したいと思います。

まずは、YAPC::Asia 2014 の LT から。 こちらは、Dancer2 のリリースマネージャーの SawyerX による、Dancer2の超速紹介です。 Dancer2 の要点が凝縮されたLTです。


LT / Dancer2 / Sawyer X

目を凝らすとこんなスライドが見えます。DSLで、ルーティングを記述します。

package MyApp;
use Dancer2;

get '/' => sub {
   template index => {
      name => 'Sawyer X',
      event => 'YAPC::Asia'
   }
};

JSON を返却するようなAPIも簡単に用意できます。

package MyApp::API;
use Dancer2;

set serializer => 'JSON';

get '/' => sub {
    return {
        hello => 'world',
    }
};

Dancer2 は Plack化されているので、plackupできます。

# app.psgi
use MyApp;
my $app = MyApp->psgi_app;
plackup app.psgi

ここまでが、LTの抜粋です。

Dancer2 は、元々、Ruby のSinatra を Perl に port した Dancer の次バージョンです。 Dancer の DSL はほぼそのままに、設計面での調整が大幅に入っています*1

例えば、以下のような対応が行われています。

  • Plack 対応
  • DSL 実装を、Top 空間から、Dancer2::Core::DSL に分解
  • Moo 採用
  • デザインパターンの調整(デメテルの法則...)

この対応に関して、2011 年の Dancer Advent Calendar にて、(超訳ですが)「全部書き換えるぞい」という記事があります。

Dancer 2, or Why I Rewrote Everything | PerlDancer Advent Calendar

利用者が多数のプロダクトにおいて、こういった完全な書き換えは、個人的な興味をそそりました。 今現在も活発に開発され、Dancer という名前を冠するPerl カンファレンスも開かれています。

Dancer を作った sukria のポスト。 https://blog.sukria.net/2015/10/22/perl-dancer-2015-reportblog.sukria.net

最近の開発状況の話。


SawyerX - State of Dancer

(Dancer2::XS ってあって、すごいってなった)

もう少し、Dancer2 の特徴を触れて、記事を終わりにしたいと思います。
(と言っても、ほぼ、2014 年の dancer advent calendar *2 からの抜粋です。

fatpack、つまり一枚スクリプトにするのをサポートしています。 (なので、XSモジュールは、recommend 扱いです)

ポータビリティを考えると良い選択になるかもしれません。

コマンドラインで利用も考慮されています。

use Dancer2;

warn config->{environment}; # => development
warn dancer_version;        # => 0.165000

複数のアプリケーションの同居が考慮されています。 Dancer2 に appname を渡すことで、config やdbh などが、appname ごとに管理されます。

以下の例だと、 MyApp::Foo1, Foo2 で、一つの Dancer2::Core::App obj が作られ、 Bar にもう一つの Dancer2::Core::App obj が作られます。

package MyApp::Foo1 {
  use Dancer2 appname => 'foo';
  get '/' => sub { ... }
}

package MyApp::Foo2 {
  use Dancer2 appname => 'foo';
  get '/' => sub { ... }
}

package MyApp::Bar {
  use Dancer2;
  get '/' => sub { ... }
}

まとめ

  • なんだか Dancer2 楽しそうだぞ

明日は、akihiro_0228 さんです。

*1:http://advent.perldancer.org/2014/2

*2:SawyerX の一人アドベントカレンダー。つよい。