Perl モジュールの作り方

※本記事は、旧 Tech Talk Blog 内の 「Perl モジュールの作り方 (http://www.sixapart.jp/techtalk/2007/02/how_to_make_perl_module.html) はてなブックマーク - 」 で公開されていた記事を移転しました。

こんにちは。TypePad Engineer の重田です。

今年も YAPC::Asia Tokyo の季節がやってきました。今回も豪華メンバが参加するのでとても楽しみですね。

さて今回はYAPCにちなんでPerlモジュールの作成方法をご紹介します。

準備

Perl プログラマのバイブルである Perl Best Practices の Chapter17: Modules の Refactoring の冒頭で Damian Conway が言っています。

Place original code inline.

Place duplicated code in a subroutine.

Place duplicated subroutines in a module.

さあ皆さんもそろそろ車輪の再発明に別れを告げてモジュール作りをはじめてみませんか?

モジュール作り

h2xs

少し前の書籍などでは h2xs でPerlモジュールを作ろうという文献があります。以下のようになります。

colinux:~# h2xs -X -a -n Foo::Bar::Baz
Defaulting to backwards compatibility with perl 5.8.8
If you intend this module to be compatible with earlier perl versions, please
specify a minimum perl version with the -b option.
Writing Foo-Bar-Baz/lib/Foo/Bar/Baz.pm
Writing Foo-Bar-Baz/Makefile.PL
Writing Foo-Bar-Baz/README
Writing Foo-Bar-Baz/t/Foo-Bar-Baz.t
Writing Foo-Bar-Baz/Changes
Writing Foo-Bar-Baz/MANIFEST

このように h2xs でもPerlモジュールを作成することが可能です。

colinux:~/Foo-Bar-Baz# perl Makefile.PL
colinux:~/Foo-Bar-Baz# make 
colinux:~/Foo-Bar-Baz# make test
colinux:~/Foo-Bar-Baz# make install

make を使ってビルド・インストールします。

Module::Starter

でも最近は h2xs を使う方法よりも Module::Starter を使う方が cool です。Module::Starter は CPAN から入手してください。CPANからの入手方法は次の通りですね。

colinux:~# cpan Module::Starter

Module::Starter をインストールすると、module-starter という Module::Starter を利用するためのコマンドもインストールされます。この module-starter を利用してPerlモジュールを作ることになります。

colinux:~# module-starter --module=Foo::Bar::Baz --author="Takatsugu Shigeta" --email=foo@example.com
Created starter directories and files
colinux:~# find Foo-Bar-Baz/ -type f
Foo-Bar-Baz/t/pod.t
Foo-Bar-Baz/t/boilerplate.t
Foo-Bar-Baz/t/00-load.t
Foo-Bar-Baz/t/pod-coverage.t
Foo-Bar-Baz/lib/Foo/Bar/Baz.pm
Foo-Bar-Baz/README
Foo-Bar-Baz/Changes
Foo-Bar-Baz/Makefile.PL
Foo-Bar-Baz/.cvsignore
Foo-Bar-Baz/MANIFEST

引数 module にモジュール名、引数 author に名前、引数 email にメールアドレスが最低限必要な引数です。(module-starter は module、author、email 以外にも license や builder といった引数を利用することができます。詳しくは perldoc Module::Starter で確認できます。)また、~/.module-starter/config というファイルを用意すれば、引数を事前に設定しておくことが可能ですので、以下のようにmodule-starterがシンプルになります。

colinux:~# cat ~/.module-starter/config
author: Takatsugu Shigeta
email: foo@example.com
colinux:~# module-starter --module=Foo::Bar::Baz

そして Damian Conway は Perl Best Practices 用に Module::Starter::PBP というモジュールを用意してくれました。こちらも CPAN からダウンロードすることができます。

colinux:~# cpan Module::Starter::PBP
colinux:~# perl -MModule::Starter::PBP=setup
Creating /root/.module-starter/PBP...done.
Creating /root/.module-starter/PBP/t...done.
Creating /root/.module-starter/config...
Please enter your full name: Takatsugu Shigeta
Please enter an email address: foo@example.com
Writing /root/.module-starter/config...
done.
Installing templates...
/root/.module-starter/PBP/Build.PL...done
/root/.module-starter/PBP/Makefile.PL...done
/root/.module-starter/PBP/README...done
/root/.module-starter/PBP/Changes...done
/root/.module-starter/PBP/Module.pm...done
/root/.module-starter/PBP/t/pod-coverage.t...done
/root/.module-starter/PBP/t/pod.t...done
/root/.module-starter/PBP/t/perlcritic.t...done
Installation complete.
colinux:~# cat ~/.module-starter/config
author:  Takatsugu Shigeta
email:   foo@example.com
builder: ExtUtils::MakeMaker Module::Build
plugins: Module::Starter::PBP
template_dir: /root/.module-starter/PBP

Module::Starter::PBP は setup すると ~/.module-starter/config やモジュールやテストの雛形が出来上がります。今後 module-starter はこれらを利用してPerlモジュールを作成してくれます。

colinux:~# module-starter --module=Foo::Bar::Baz
Created starter directories and files
colinux:~# find Foo-Bar-Baz/ -type f
Foo-Bar-Baz/t/pod.t
Foo-Bar-Baz/t/perlcritic.t
Foo-Bar-Baz/t/00.load.t
Foo-Bar-Baz/t/pod-coverage.t
Foo-Bar-Baz/lib/Foo/Bar/Baz.pm
Foo-Bar-Baz/README
Foo-Bar-Baz/Changes
Foo-Bar-Baz/Build.PL
Foo-Bar-Baz/Makefile.PL
Foo-Bar-Baz/.cvsignore
Foo-Bar-Baz/MANIFEST

Module::Starter::PBP は Build.PL も生成してくれます。これは Module::Build を使ってビルドする場合に使います。

colinux:~/Foo-Bar-Baz# perl Build.PL
colinux:~/Foo-Bar-Baz# ./Build
colinux:~/Foo-Bar-Baz# ./Build test
colinux:~/Foo-Bar-Baz# ./Build install

モジュールのビルドも make を使うよりも Module::Build を使う方が cool ですね。(とりあえず Module::Build についてはまた別の機会にご紹介します)

まとめ

  • Perlモジュールは、h2xs ではなく Module::Starter(module-starter)で作ろう。
  • Module::Starter::PBP はちょっと便利だぞ。
  • モジュールを作ったら CPAN へ登録しよう。

また次回お会いしましょう。

Six Apart をフォローしませんか?

次の記事へ

Movable Type 4 Hack-a-thon のお知らせ

前の記事へ

野良plu: PostVox