Hatena::ブログ(Diary)

色々メモにっき

2008-03-23 Module::Starter使ってみる

[][][][]モジュール作成

いい加減、makefileのついたモジュール作りたいなーと思って始めた。モジュール整理。結構面倒だった...orz

最終的にはテストが楽しくて、面白かったけど。今後、忘れそうな事などまとめてメモ!

まずはインストール

cpan> install Module::Starter
cpan> install Module::Starter::PBP
cpan> install Module::Starter::Smart

※通常だとモジュールの追加が出来ないので、追加できるようにするためにModule::Starter::Smartも一緒にインストールする。

次にターミナル上で以下のコマンドを入力。名前とメルアドの設定をする。

$ perl -MModule::Starter::PBP=setup

Please enter your full name : UnyaUnya
Please enter an email address : unyaunya@mail.com

すると、自分のホームディレクトリ以下~/.module-starterが作成される。

Smartを有効にするために、このファイルに以下を追記

plugins: Module::Starter::PBP Module::Starter::Smart

モジュールを作ってみる

$ module-starter --module=My::UnyaUnya

ちなみに、あるやつにモジュール追加したいとき

$ module-starter --module=My::UnyaUnya2 --distro=My

できたら、ビルドできるかどうか、テストしてみる。

$ cd My-UnyaUnya
$ perl Build.PL
$ perl Build
$ perl Build test

これがうまくいかないときは、Test::Pod::Coverage、Test::Perl::Criticをインストールする。また、私の場合は.pmファイルの$VERSION = qv('0.0.3') を our $VERSION = qv('0.0.3')にする必要があった。

で、ここまで出来たら、後はがつがつモジュール書くだけ!


ビルドに成功したら、パッケージング

Build.PLのrequiresの項目に使っているモジュールを追加する。

requires=>{
   'Test::More' => 0,
   'version'    => 0,
   'Class::Accessor' => 0,
},

で、あとは、Makefile.PLの中身を変更

use lib qw(lib);
use Module::Build::Compat;
Module::Build::Compat->run_build_pl(args => \@ARGV);
Module::Build::Compat->write_makefile(build_class => 'Module::Build');

最後にMANIFEST.SKIPを作成

\bRCS\b
\bCVS\b
^MANIFEST\.
^Makefile$
^Build$
^Build.bat$
^_build/
\.(bak|tdy|old|tmp)$
~$
^blib/
^pm_to_blib
\.cvsignore
\.gz$

配布ファイル一覧を示すMANIFESTファイルを作成

$ perl Build manifest

準備が出来たら以下のコマンド

$ perl Makefile.PL
$ make
$ make test
$ make install

私はここで、インストールする場所を指定したいので、以下のコマンド

$ perl Makefile.PL PREFIX=/home/unya/Modules/

また、@INCにこの場所を参照させたい場合は、~/.bashrcに以下を追記

PERL5LIB=/home/unya/Modules/share/perl/5.8.4/;export PERL5LIB

パッケージング

$ perl Build dist

参考URL

http://itpro.nikkeibp.co.jp/article/COLUMN/20071011/284280/?P=1&ST=develop

[][]Class::Accessor

コンストラクタとか毎回書くのが面倒で、何とかならないかなーと思っていたところでこれを発見。おお、便利だ!

use base qw/Class::Accessor/;
__PACKAGE__ -> follow_best_practice;
__PACKAGE__ -> mk_accessors( qw ( foo ) );
__PACKAGE__ -> new ({ foo => 45 });    # 初期値を代入

sub test{
   my $self = shift;  # オブジェクトへのリファレンス

   # getアクセサ
   print $self -> get_foo();   # 45
   
   # setアクセサ
   $self -> set_foo(30);
   print $self -> get_foo();   # 30   
}

follow_best_practiceってするとget_,set_を付けないと駄目になるらしいよ。これは無いと気持ち悪いので、私は必須!