あいつの日誌β

働きながら旅しています。

Module::Setup::Flavor の使い方

あらすじ

my flavor が欲しいので Module::Setup::Flavor を使ってみました。その備忘録です。
例としてModule::Setup::Flavor::StaticApp を作ってみます。

なお、作業するカレントディレクトリは ~/project を想定しています。

フレーバーを修正する

フレーバーを生成します。フレーバー名をMyStaticAppとします。

% module-setup --init MyStaticApp                                                  [~]Creating /Users/okamura/.module-setup/flavors/MyStaticApp/template/Makefile.PL
Creating /Users/okamura/.module-setup/flavors/MyStaticApp/template/t/00_compile.t
Creating /Users/okamura/.module-setup/flavors/MyStaticApp/template/xt/01_podspell.t
Creating /Users/okamura/.module-setup/flavors/MyStaticApp/template/xt/02_perlcritic.t
Creating /Users/okamura/.module-setup/flavors/MyStaticApp/template/xt/03_pod.t
Creating /Users/okamura/.module-setup/flavors/MyStaticApp/template/xt/perlcriticrc
Creating /Users/okamura/.module-setup/flavors/MyStaticApp/template/Changes
Creating /Users/okamura/.module-setup/flavors/MyStaticApp/template/lib/____var-module_path-var____.pm
Creating /Users/okamura/.module-setup/flavors/MyStaticApp/template/MANIFEST.SKIP
Creating /Users/okamura/.module-setup/flavors/MyStaticApp/template/README
Creating /Users/okamura/.module-setup/flavors/MyStaticApp/template/.shipit
Creating directory /Users/okamura/.module-setup/flavors/MyStaticApp/additional
Dump config /Users/okamura/.module-setup/flavors/MyStaticApp/additional/config.yaml
Creating directory /Users/okamura/.module-setup/flavors/MyStaticApp/plugins
Creating directory /Users/okamura/.module-setup/flavors/MyStaticApp/template
Do you use SVN? [yN] [n]
Do you use SVK? [yN] [n]
Do you use Git? [yN] [n] y
You chose version control system: Git
Your name:  [Default Name] okamuuu
Your email:  [default {at} example.com] okamuuu {at} example.com
Dump config /Users/okamura/.module-setup/flavors/MyStaticApp/config.yaml

~/.module-setup 以下に MyStaticApp のフレーバーができました。

% head ~/.module-setup/flavors/MyStaticApp/template/lib/____var-module_path-var____.pm
package [% module %];
use strict;
use warnings;
our $VERSION = '0.01';

1;
__END__

=head1 NAME

次のように hello メソッドを追加しました。

% head ~/.module-setup/flavors/MyStaticApp/template/lib/____var-module_path-var____.pm
package [% module %];
use strict;
use warnings;
our $VERSION = '0.01';

sub hello { print 'hello, world' }

1;
__END__

この状態で次のコマンドを実行します。

% module-setup MyApp MyStaticApp
Creating directory MyAppCreating MyApp/.shipit
Creating MyApp/Changes
Creating MyApp/Makefile.PL
Creating MyApp/MANIFEST.SKIP
Creating MyApp/README
Creating MyApp/lib/MyApp.pm
Creating MyApp/t/00_compile.t
Creating MyApp/xt/01_podspell.t
Creating MyApp/xt/02_perlcritic.t
Creating MyApp/xt/03_pod.t
Creating MyApp/xt/perlcriticrc
...

生成された雛形を確認します。先ほど実装した hello メソッドが既に記述されているはずです。

% cd MyApp
% head lib/MyApp.pm
package MyApp;
use strict;
use warnings;
our $VERSION = '0.01';

sub hello { print 'hello, world' }

1;
__END__

フレーバーを追記する

static.psgi を追加します。

% cat ~/.module-setup/flavors/MyStaticApp/template/static.psgi          [~/project/MyApp]
use Plack::Builder;
builder {
enable "Plack::Middleware::Static",
    path => sub { s!(.*/$)!${1}/index.html! or return qr{^/.+} },
    root => './static/';
};

フレーバーから雛形を再生成します。カレントディレクトリの位置にご注意下さい。
MyApp/static.psgi が生成され、その他は既に存在しているので上書きしていません。

% cd ~/project
% module-setup MyApp MyStaticApp
Creating directory MyApp
MyApp/.shipit exists. Override? [yN]  [n] 
MyApp/Changes exists. Override? [yN]  [n] 
MyApp/Makefile.PL exists. Override? [yN]  [n] 
MyApp/MANIFEST.SKIP exists. Override? [yN]  [n] 
MyApp/README exists. Override? [yN]  [n] 
Creating MyApp/static.psgi
MyApp/lib/MyApp.pm exists. Override? [yN]  [n] 
MyApp/t/00_compile.t exists. Override? [yN]  [n] 
MyApp/xt/01_podspell.t exists. Override? [yN]  [n] 
MyApp/xt/02_perlcritic.t exists. Override? [yN]  [n] 
MyApp/xt/03_pod.t exists. Override? [yN]  [n] 
MyApp/xt/perlcriticrc exists. Override? [yN]  [n] 
...
% cd MyApp
% cat static.psgi
...

フレーバーを他人と共有する

~/.module-setup 以下に自分が使っているフレーバーと同じ物をセットすれば良いわけですが、ここには Your name と Your email があなたの設定になっているはずです。

ですので ~/module-setup を共有するのではなく、 生成する仕組みを共有する必要があります。
そのためにモジュール化します。cpanized ディレクトリ構造を用意します。

% cd ~/project
% module-setup Module::Setup::Flavor::StaticApp
[1]: default
[2]: MyStaticApp
Select flavor: [1] 1
You chose flavor: default
Creating directory Module-Setup-Flavor-StaticApp
Creating Module-Setup-Flavor-StaticApp/.shipit
Creating Module-Setup-Flavor-StaticApp/Changes
Creating Module-Setup-Flavor-StaticApp/Makefile.PL
Creating Module-Setup-Flavor-StaticApp/MANIFEST.SKIP
...

Module::Setup::Flavor::StaticApp.pm を書き換えます。
間違えてたので修正 s/StaticApp/Module::Setup::Flavor::StaticApp/ (2012-02-16)

% cd ~/project
% module-setup --pack Module::Setup::Flavor::StaticApp MyStaticApp > ~/project/Module-Setup-Flavor-StaticApp/lib/Module/Setup/Flavor/StaticApp.pm

作成したモジュールでフレーバーを使ってみる

パスを通します。 zsh の設定ファイルなどを以下のようにしておきます。

PERL5LIB=$HOME/project/Module-Setup-Flavor-StaticApp/lib:$PERL5LIB
export PERL5LIB

Module::Setup::Flavor::StaticApp.pm を使って ~/.module-setup 以下にフレーバーを作成します。
間違いを修正しました(2012-02-06)

% module-setup --init --flavor-class=StaticApp StaticApp

新規プロジェクトを作成すると次のように対話モードでStaticAppが選べるようになっている事が確認できます。

% module-setup MyApp2
[1]: default
[2]: MyStaticApp
[3]: StaticApp
Select flavor: [1] 

感想

module-setup --pack のくだりに関してはそのまま Module::Setup::Flavor::StaticApp が作れそうな気がしたのですがよくわからなかったのでとりあえず上記のようにしています。

あと SYNOPSIS が本当にこれでいいのかわからない。 s/StaticApp/module/ でなくていいのかしら?

% module-setup --pack StaticApp MyStaticApp | head -n 15 | tail -n 4
=head1 SYNOPSIS

  StaticApp-setup --init --flavor-class=+StaticApp new_flavor