モダンPerlの世界へようこそ

第25回Module::Starter:モジュールを書くためのテンプレート

モジュールを再利用可能にするためのツールたち

Perl 4の時代まではいざ知らず、いまどきPerlのモジュールやアプリケーションを再配布しようと思ったら、CPANモジュールと同じ形式にしておくのがベタープラクティスです。たとえ一般には公開しない社外秘のモジュールであっても、Makefile.PLやBuild.PLを用意して、テストも書いて、できればREADMEやChangesなどの更新履歴もつけておけば、別のプロジェクトを立ち上げたときにコピー&ペーストする必要もなくなりますし、業務の引き継ぎなども簡単になります。

とはいえ、モジュールを書くたびにMakefile.PLなどを一から書きおこすのは面倒な話。メタ情報の部分はモジュールごとに異なるとはいえ、それ以外の部分は(特にひな形の時点では)大差ないのがふつうですから、できれば省力化したいところです。

今回はそんなときに使われるひな形作成ツールについてまとめてみましょう。

本来とは異なる用途で使われているh2xs

ひな形作成ツールとしてもっとも古くからあるのは、CのヘッダファイルをXSモジュールに変換するためにつくられたh2xsです。これはもともとPerl 4の時代につくられたh2phというCのヘッダファイルをPerlのヘッダファイルに変換するためのスクリプトの後釜として書かれたもので、Perl 5のコアモジュールとしてはSocketモジュールとFcntlモジュールがh2xsでつくられています。その本来の使い方は、このようにヘッダファイルを引数として渡すというものでした。

> h2xs fcntl.h

ただし、こうして変換したXSモジュールは、そのままでは役に立ちません。XSのコードを呼び出すには対応する.pmファイルが必要ですし、XSのコードをコンパイルする際にはMakefile.PLなどもほしいところです。そのため、h2xsではヘッダファイルを変換した成果をそのままパッケージングできるように、XS本体だけでなく、対応する.pmファイルや、Makefile.PL、README、基本のテストなどを一式用意してくれるようになっています。その「おまけ」はXSとは無縁の一般的なモジュールをつくるときにも有効に使えるため、Perl 5.002の時代にはもう本来のヘッダファイルをXSに変換する作業なしでも使えるように改造され、書籍などでも新しいモジュールをつくるときのお作法として紹介されるようになりました。次の例は、Foo::Barというモジュールのひな形をつくる、という風にも読めますが、本当は-AオプションでAutoLoaderの機能を、-XオプションでXS部分を省略し、-nオプションでモジュール名を指定し、本来の引数であるヘッダファイルは省略した、と読むのが正解です。

> h2xs -XAn Foo::Bar

このh2xsも最近ではずいぶんとオプションが増えてきたのですが(詳しくはperldoc h2xsをご覧ください⁠⁠、なかでも特に覚えておきたいのは-bオプションです。h2xsは、特に指定がない場合、生成するMakefile.PLにスクリプトを実行したPerlのバージョンより新しいPerlしかサポートしないという指示を書き込むのですが、一般的にこの指定はあまりに厳しすぎる(たいていの場合、もっと古いPerlでも問題なく動作する)ため、無頓着なh2xs製モジュールが嫌われる原因のひとつとなっていました。h2xs 1.21(Perl 5.6.1)で実装された-bオプションをつけると必要なPerlのバージョンを明示的に指定できるほか、5.6以前のPerlをサポートする場合にはourやuse warningsを使わないという配慮もしてくれるので、h2xsを使うならかならず指定しておきたいところです。

> h2xs -b 5.6.0 -XAn Foo::Bar

ExtUtils::ModuleMaker

もっとも、ひな形をつくるためのツールとして見た場合、h2xsはそれほど使い勝手のよいものではありません。Module::Buildのように新しいツールには対応していませんし、名前の点でもひな形を連想させるところはありませんから、例によって21世紀に入ると、より適切な名前をもつ代替品がつくられるようになってきました。そのひとつが、ジェフリー・エイヴリー(Geoffrey Avery)氏が2001年にリリースしたExtUtils::ModuleMakerです。

これはもともとModuleMakerという名前だったものを当時の流儀にならってExtUtils配下に組み込んだもので、各種の設定をインタラクティブに設定できるようになっているのが最大の特徴。modulemakerというコマンドラインツールを単独で実行するとこのような画面が表示されます。

------------------------

modulemaker: Main Menu

    Feature                     Current Value
N - Name of module              ''
S - Abstract                    'Module abstract (

指示に従ってコマンドを入力し(念のため、改行が必要です⁠⁠、必要な情報を入力したらまたメニューに戻り、最後にGないしHを入力すれば、必要な情報が埋め込まれた各種ファイルのできあがり。これらの設定はコマンドラインオプションとして渡すこともできますし、毎回変わるモジュール名と概要以外はファイルに保存しておくこともできます。

ExtUtils::ModuleMakerはh2xsのような一枚岩のスクリプトに比べると拡張性が高いのも特徴で、モジュールを継承するといろいろなところに手を加えられます。文言や並び順を修正する程度であれば、Perl品質管理チームのデイヴィッド・ゴールデン氏が2004年にリリースしたExtUtils::ModuleMaker::TTを使うと、わざわざソースコードを拡張しなくてもテンプレートレベルで簡単にひな形を修正することもできます。

ExtUtils::ModuleMakerは2001年のアドベントカレンダーや2003年のYAPCで紹介されて注目を集め、国内でも4、5年前から何度か話題になりました。初心者向けとしては便利なモジュールですが、初期設定では作成されるディレクトリが深すぎる[1]といった弱みもありましたし、名前空間的にも古くささを感じさせたため、デファクトスタンダードの地位を築くまでにはいたりませんでした。

Module::Starter

ExtUtils::ModuleMakerにかわって台頭してきたのがアンディ・レスター(Andy Lester)氏が2004年にリリースしたModule::Starterです。これはExtUtils::MakeMakerに対するModule::Buildのような立ち位置のモジュールで、現在でもわりと最新の書き方にあわせて修正が加えられていますし、Perlに付属しているperlnewmodや、2005年のロンドンPerlワークショップの発表中に作成されたAcme::CreatingCPANModulesのような新しいモジュールの作り方を説明するマニュアル類などにも用例が紹介されています。

Module::Starterの起動コマンドはmodule-starterですが、Module::Starterは作者の名前とメールアドレスを指定しないとエラーになるので、あらかじめ設定ファイルを用意して値を書き込んでおくとよいでしょう。標準的にはホームディレクトリの下に.module-starterというディレクトリを堀り、そのなかにconfigというファイルを用意します。ここでは名前とメールアドレスしか用意していませんが、お好みでプラグインや追加のオプションを指定することもできます。

author: Kenichi Ishigaki
email: ishigaki at cpan.org

この設定すら面倒な方は、⁠Perlベストプラクティス』の著者ダミアン・コンウェイ(Damian Conway)氏が用意しているModule::Starter::PBPというモジュールを利用すると簡単に初期設定をすませられます。また、この方法を使うと『Perlベストプラクティス』流のひな形も.module_starterディレクトリのなかに用意されるので、ひな形を自分好みに書き直すのも簡単にできるようになります。

> cpan Module::Starter::PBP
> perl -MModule::Starter::PBP=setup

設定が済んだら適当なモジュールを書いてみましょう。これでFoo-Barというディレクトリの下にFoo::Barモジュールのためのひな形一式が用意されます。

> module-starter --module Foo::Bar

「PBPも悪くないけれど、Module::Buildを強制されるのはイヤ」という方は、リカルド・シグネス(Ricardo Signes)氏のModule::Starter::Plugin::TT2と、氏のModule::Starter::Plugin::DirStoreモジュールを使うとよいでしょう。.module_starter/configファイルをこのように修正すると、template_dirオプション以下のディレクトリに独自のテンプレートを用意できるようになります(template_dirオプションの値はご自分の環境にあわせて修正してください⁠⁠。

author: Kenichi Ishigaki
email: ishigaki at cpan.org
plugins: Module::Starter::Simple Module::Starter::Plugin::Template Module::Starter::Plugin::TT2 Module::Starter::Plugin::DirStore
template_dir: .module_starter/template/

もっといろいろなファイルを作成したい場合は、Module::Starter::Simpleや、カーティス・ジュエル(Curtis Jewell)氏のModule::Starter::CSJEWELLを参考に、自前のcreate_distroメソッドを用意してください。

pmsetupとModule::Setup

Module::Starterも決して悪いモジュールではありませんし、ExtUtils::ModuleMakerの場合と同じくコードを書けばかなり柔軟に拡張できますが、そんな手間をかけるくらいなら簡単なひな形を自作した方がマシ、という意見にも一理あります。

宮川達彦氏の個人リポジトリにあるpmsetupというひな形作成ツールは、スクリプトファイルの末尾にひな形を用意しておいて、実行時に値を埋め込んで保存してくれるというもの。コード部分は100行にも満たない小品ですが、世界でも有数のモジュール作者である氏の最新のスタイルをマネできるという意味ではこれ以上の教材もないでしょうCodeReposにはほかにもいくつかそれぞれの流儀にあわせて改造されたpmsetupが収録されています⁠⁠。コマンドラインから「pmsetup モジュール名」を実行すると必要なひな形が用意されます(作者名などの情報はホームディレクトリの.pmsetupを読むようになっていますが、設定が不足している場合は対話的に入力できるようになっています⁠⁠。

Yappoこと大沢和宏氏のModule::Setupはそのpmsetupをもとにさまざまな改良が加えられたもの。基本的な使い方はpmsetupに準じますが、アプリケーションやフレームワークにあわせてテンプレート(フレーバー)を切り替えられるようになっていたり、gitのリポジトリを初期化できるようになっていたりと、かゆいところに手が届くようになっているのが大きな特徴です。Module::Setupについては2009年のJPerl Advent Calendarなどでも詳しく解説されているのであわせてご覧ください。この原稿を書いている時点ではWindows環境でいくつかのテストが通らないようでしたが(時間のある方はぜひパッチを送ってあげてください⁠⁠、ほとんどの方はこれを使っておけば用事が足りるはずです。

たまにはひな形の更新を

ひな形作成ツールとしては、ほかにもさまざまなウェブアプリケーションフレームワークが専用のひな形を作成するためのヘルパースクリプトを用意しています。こういったヘルパースクリプトは、フレームワークに同梱されている場合もありますし、Catalyst::Develのように独立したパッケージが用意されている場合もありますが、このようなツールは一度使い方を覚えてしまうとなかなか更新されなくなってしまうため、場合によっては一昔も二昔も前の、問題がある書き方を再生産する原因になってしまうこともあります。

最近ではアレクサンドル・チョルニ(Alexandr Ciornii)氏がCPAN上にあがっている古いExtUtils::MakeMakerのMakefile.PLの更新をうながすためにApp::EUMM::UpgradeApp::EUMM::Migrateというモジュールを作成し、github上のさまざまなCPAN関連リポジトリに注意喚起のpull requestを送っていましたが、ご自分が使っているツールが十分新しい書き方に対応しているか、たまには確認していただければと思います。

おすすめ記事

記事・ニュース一覧