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

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

この記事を読むのに必要な時間:およそ 1.5 分

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

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 (<= 44 characters) goes here'
A - Author information
L - License                     'perl'
D - Directives
B - Build system                'ExtUtils::MakeMaker'

G - Generate module
H - Generate module;
    save selections as defaults

X - Exit immediately

Please choose which feature you would like to edit:

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

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

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

※1

Directivesのなかに入ってCompactの設定を1にすると改善されます。

著者プロフィール

石垣憲一(いしがきけんいち)

あるときは翻訳家。あるときはPerlプログラマ。先日『カクテルホントのうんちく話』(柴田書店)を上梓。最新刊は『ガリア戦記』(平凡社ライブラリー)。

URLhttp://d.hatena.ne.jp/charsbar/

コメント

コメントの記入