<?xml version='1.0' encoding='utf-8'?>
<pod xmlns="http://axkit.org/ns/2000/pod2xml">
<head>
	<title>名前</title>
</head>
<sect1>
<title>名前</title>
<para>
perlnewmod - 新しいモジュールを配布するには
</para>
</sect1>
<sect1>
<title>説明</title>
<para>
このドキュメントは、Perl モジュールを書き、配布する準備をして、CPAN を
通じて取得可能にするためのアドバイスです。
</para>
<para>
Perl が実際にこんなに強力な理由の1つとして、Perl ハッカーたちが、自分
の直面した問題への解決策を共有しようとしていることが挙げられるでしょう。
だから、みんなが同じ問題に悩む必要はないわけです。
</para>
<para>
これが実現されているのは、多くの場合あるソリューションを抽象化して、
Perl モジュールにしているということです。もしこれがなんのことかわから
なければ、このドキュメントの残りはあまり役には立たないでしょうし、今ま
でにたくさんの便利なコードを見逃していることでしょう。<link xref='perlmod'>perlmod</link>,
<link xref='perlmodlib'>perlmodlib</link>, <link xref='perlmodinstall'>perlmodinstall</link> をよく読んで、ここに戻って来てくださ
い。
</para>
<para>
もし、あなたがやるべきことに関するモジュールが存在せず、自分でコードを
書かないといけないとなったときには、そのソリューションをモジュールに詰
め込んで CPAN にアップロードすることを検討してください。そうすれば、他
のみんなの利益になります。
</para>
<sect2>
<title>警告</title>
<para>
ここでは主にピュアPerl のモジュールについて説明し、XS モジュールについ
ては触れません。XS モジュールは、通常とは若干異なる目的で利用されるた
め、配布する際には別の問題について考慮する必要があります。つまり、糊付
け(glue)の対象となるライブラリの人気、他のOSへのポータビリティなどです。
しかし、モジュールの準備やパッケージング、配布の説明は、XS モジュール
にも同様に当てはまるでしょう。
</para>
</sect2>
<sect2>
<title>なにをモジュールにしたらいい？</title>
<para>
他の人に便利になるものなら、どんなコードでもモジュールにするべきです。
みんなが使っているライブラリに足りないものを補って、しかも他の人が自分
のプログラムに直接組み込めるものならなんでもOKです。あなたのコードのう
ち、単独でとりだして、他のものに組み込めるものがあれば、それはモジュー
ルの候補になりえるでしょう。
</para>
<para>
例をとってみましょう。ローカルのフォーマットからデータを読みだし、Perl 
のハッシュリファレンスのハッシュにして、ツリー構造にして、ツリーを操作
してそれぞれのノードを Acme Transmogrifier Server にパイプするとします。
</para>
<para>
さて、Acme Transmogrifier をもっている人はあんまりいないとしましょう。
ですから、そのプロトコルを話すコードをスクラッチから書かなくてはならな
いでしょう。そんな時、それをモジュールにしたいはずです。どのレベルで操
作するかはあなた次第です。<link xref='Net::SMTP'>Net::SMTP</link> のようなプロトコルレベルのモジュー
ルから、<link xref='Mail::Send'>Mail::Send</link> のような高レベルで操作するモジュールまで。決定す
るのはあなたですが、サーバプロトコルに特化したモジュールをつくりたいで
しょう。
</para>
<para>
あなたのローカルデータフォーマットに興味がある人はいません。だからそれ
は無視しましょう。ただ、その中間データはどうしましょう。Perl 変数から
ツリー構造を作って、それをトラバースするのはよくあることです。それに、
もしそういったモジュールを誰もかいてないのであれば、そのコードもまたモ
ジュール化したくなるでしょう。
</para>
<para>
さあ、どんなものをモジュール化すればいいのか、だんだんわかってきたでしょ
う。これからそれをどうやってやるのか見てみましょう。
</para>
</sect2>
<sect2>
<title>Step-by-step: 地面の整備</title>
<para>
コードを書きはじめるまえに、やっておきたいことがいくつかあります。
</para>
<list>
<item><itemtext>見てまわる</itemtext>
<para>
たくさんのモジュールをみて、どんな風に書かれているかみてみましょう。
<link xref='Text::Tabs'>Text::Tabs</link> は標準ライブラリで、きれいに書かれていてとてもシンプルで
すので、これからはじめるとよいでしょう。次に <link xref='Time::Zone'>Time::Zone</link> や 
<link xref='{tag:xlink uri='File::Copy'>File::Copy</xlink>'}<xlink uri='File::Copy'>File::Copy</xlink></link>、それにもしオブジェクト指向のコードを書こうと思っている
なら、<code>Mail::*</code> のいくつかをみてみるとよいでしょう。
</para>
<para>
そうすれば、モジュールがどのようにレイアウトされ、書かれているか、大体
わかってくるはずです。
</para>
</item>
<item><itemtext>新しいものかどうかチェックする</itemtext>
<para>
CPAN にはたくさんのモジュールがありますから、あなたがコントリビュート
しようとしているモジュールとそっくりなものがあっても、見過ごしてしまう
かも知れません。モジュールリストや <filename>by-module</filename> ディレクトリをよくみて、
車輪の再発明をしていないかどうか確認しましょう!
</para>
</item>
<item><itemtext>必要性を議論する</itemtext>
<para>
あなたはそれを気に入っているでしょう。他のみんなも、それを必要とすると
思っているでしょう。でも、実際にはそんなに需要はないかもしれません。自
分のモジュールがどの程度需要があるのか不安だったら、
<code>comp.lang.perl.modules</code> に投稿してみましょう。それでもだめなら、
<code>modules@perl.org</code> のモジュールメーリングリストに聞いてみましょう。こ
のメーリングリストはクローズドで、待ち時間が長いことに気を付けてくださ
い。レスポンスが返ってくるまでには、しばらく待つ必要があるかもしれませ
ん。
</para>
</item>
<item><itemtext>名前を決める</itemtext>
<para>
CPAN にふくまれる Perl モジュールには、ネーミング階層があり、それに合
わせる必要があります。これがどのように整理されているかの詳細は、
<link xref='perlmodlib'>perlmodlib</link> をみてください。また、CPAN やモジュールリストを見て回っ
て、どんなものか触れてみてください。少なくとも、これだけは覚えておいて
ください: モジュール名は大文字ではじめる (This::That のように), カテゴ
リに適合している、そして、目的を簡潔に説明している。
</para>
</item>
<item><itemtext>もう一度チェック</itemtext>
<para>
そうしている間に、書こうとしているモジュールに似たモジュールを本当に見
過ごしていないか、確認してください。
</para>
<para>
整理が付いて、そのモジュールは必要とされていて、まだ存在しないと確信し
たら、コードを書きはじめましょう。
</para>
</item>
</list>
</sect2>
<sect2>
<title>Step-by-step: モジュールを作る</title>
<list>
<item><itemtext><filename>h2xs</filename> からはじめる</itemtext>
<para>
<link xref='h2xs'>h2xs</link>は、もともとは CヘッダファイルをXS モジュールにするためのユーティ
リティだったのですが、ピュア Perl モジュール用のスケルトンをつくるユー
ティリティとしても便利です。もし <link xref='Autoloader'>Autoloader</link> (大きなモジュールを小さ
なルーチンに分割するモジュール) が必要なければ、以下のように実行します:
</para>
<verbatim><![CDATA[
h2xs -AX -n Net::Acme
]]></verbatim>
<para>
<code>-A</code> は Autoloader を省略し、<code>-X</code> は XS を省略します。<code>-n</code> でモジュー
ルの名前を指定します。
</para>
</item>
<item><itemtext>Use <link xref='strict'>strict</link> and <link xref='warnings'>warnings</link></itemtext>
<para>
モジュールのコードは warning と strict クリーンでなくてはなりません。
どんな状況でそのモジュールが利用されるかわかりませんから。それに、
warning や strict クリーンでないコードなんて、配布したくないでしょう?
</para>
</item>
<item><itemtext>Use <link xref='Carp'>Carp</link></itemtext>
<para>
<link xref='Carp'>Carp</link> モジュールを使うと、エラーメッセージを呼び出し側の視点から出力
することが出来ます。そのモジュールではなく、呼び出し側の問題であること
を示せるのです。たとえば、このようにすると:
</para>
<verbatim><![CDATA[
warn "No hostname given";
]]></verbatim>
<para>
ユーザはこのようなメッセージを見ることになります:
</para>
<verbatim><![CDATA[
No hostname given at /usr/local/lib/perl5/site_perl/5.6.0/Net/Acme.pm
line 123.
]]></verbatim>
<para>
これでは、あなたのモジュールが何か間違ったことをしているように見えます。
代わりに、ユーザに責任をなすりつけられるのです。このように出力します:
</para>
<verbatim><![CDATA[
No hostname given at bad_code, line 10.
]]></verbatim>
<para>
こうするには、<link xref='Carp'>Carp</link> をつかって、<code>warn</code> を <code>carp</code> に置き換えます。
もし <code>die</code> する必要があるなら、<code>croak</code> を使いましょう。ただ、本当に
あなたのモジュールの責任によるチェックの場合は、<code>warn</code> や <code>die</code> のま
まにしておきましょう。
</para>
</item>
<item><itemtext>Use <link xref='Exporter'>Exporter</link> - かしこく!</itemtext>
<para>
<code>h2xs</code> は <link xref='Exporter'>Exporter</link> の切れ端を提供します。これによって、シンボルや
サブルーチンをモジュールから呼び出し側の名前空間にエクスポートする標準
的な方法がわかるでしょう。たとえば、<code>use Net::Acme qw(&amp;frob)</code> と書け
ば、<code>frob</code> サブルーチンをインポートします。
</para>
<para>
パッケージ変数の <code>@EXPORT</code> によって、呼び出し側が単純に <code>use
Net::Acme</code> と書いたときに、どのシンボルがエクスポートされるかが決まり
ます。ほとんどの場合は、ここには何もいれくないでしょう。一方、
<code>@EXPORT_OK</code> をつかうと、どの変数をエクスポートしてもよいかを指定でき
ます。たくさんのシンボルをエクスポートしたい場合は、<code>%EXPORT_TAGS</code> を
つかって、エクスポートのセットを定義しましょう。詳しくは <link xref='Exporter'>Exporter</link> 
を見てください。
</para>
</item>
<item><itemtext>plain old documentation をつかう</itemtext>
<para>
仕事はペーパーワークがすむまでは、終わりではありません。モジュールのド
キュメントを書くための時間が必要です。<code>h2xs</code> を利用すれば、テンプレー
トをつくってくれますので、それを埋めればよいです。フォーマットがよくわ
からなければ、まずは <link xref='perlpod'>perlpod</link> を見てください。モジュールをどのように
使うかのおおまかな概要、そしてシンタックスの説明や、それぞれのサブルー
チンやメソッドの機能説明を提供してください。開発者のノートとして Perl 
のコメントを利用し、エンドユーザへのノートには POD を使ってください。
</para>
</item>
<item><itemtext>テストを書く</itemtext>
<para>
ぜひユニットテストコードをつくって、あなたのモジュールが、いろんなプラッ
トフォーム上の Perl で、意図した通りにうまく動くことを確認しましょう。
CPAN にモジュールをアップロードすると、たくさんのテスターがモジュール
をビルドして、テストの結果をあなたに送ってくれるでしょう。ここでもまた、
<code>h2xs</code> をつかえば、あとで拡張可能な、テストフレームワークが提供されま
す。単にコンパイルが通るかだけでなく、いろいろとテストしましょう。
</para>
</item>
<item><itemtext>README を書く</itemtext>
<para>
CPAN にアップロードするときは、README ファイルが自動で抽出されて、あな
たの CPAN ディレクトリにおかれます。また、モジュールリストに載った場合
には、<filename>by-module</filename> や <filename>by-category</filename> のメインディレクトリにも配置され
ます。このファイルに、そのモジュールのすることの詳細や、一つ前のリリー
スからの変更点を書いておくと良いでしょう。
</para>
</item>
</list>
</sect2>
<sect2>
<title>Step-by-step: モジュールを配布する</title>
<list>
<item><itemtext>CPAN ユーザ IDを取得する</itemtext>
<para>
CPAN でモジュールを配布するには、CPAN ID が必要です。どうやって取得す
るかは、<code><xlink uri='http://www.cpan.org/modules/04pause.html'>http://www.cpan.org/modules/04pause.html</xlink></code> (もしくはそのミラー) 
の指示を読んでください。
</para>
</item>
<item><itemtext><code>perl Makefile.PL; make test; make dist</code></itemtext>
<para>
ここでも、<code>h2xs</code> はすべてやってくれます。モジュールをインストールする
ときによくみる、標準的な <code>Makefile.PL</code> ができています。これが生成する 
Makefile に <code>dist</code> ターゲットがあります。
</para>
<para>
モジュールがテストにパスしたことを確認したら(いつでも確認することはよ
いことです)、 <code>make dist</code> を実行すれば、Makefile はアップロード準備の
ととのった tarball ファイルを生成してくれます。
</para>
</item>
<item><itemtext>tarball をアップロードする</itemtext>
<para>
CPAN ID を取得できたときに届く email に、PAUSE (the Perl Authors
Upload SErver) へのログイン方法が載っています。メニューから選択して、
モジュールをCPANにアップロードできます。
</para>
</item>
<item><itemtext>モジュールリストにアナウンスする</itemtext>
<para>
アップロードしたら、あなたのディレクトリにあるだけでは人目を引きません。
のこりの CPAN モジュールと同じように載せたければ、モジュールリストにそ
のことを伝えます。一番良い方法は、モジュールリストと同じスタイルで 
Email をこんな感じでかくことです:
</para>
<verbatim><![CDATA[
Net::Acme bdpOP   Interface to Acme Frobnicator servers      FOOBAR
^         ^^^^^   ^                                          ^
|         |||||   モジュールの説明                           あなたのID
|         ||||| 
|         ||||\-ライセンス: (p)standard Perl, (g)GPL, (b)BSD,
|         ||||              (l)LGPL, (a)rtistic, (o)ther
|         ||||
|         |||\- インタフェース: (O)OP, (r)eferences, (h)ybrid, (f)unctions
|         |||
|         ||\-- 言語: (p)ure Perl, C(+)+, (h)ybrid, (C), (o)ther
|         ||
Module    |\--- サポート: (d)eveloper, (m)ailing list, (u)senet, (n)one
Name      |
          \---- 開発状況: (i)dea, (c)onstructions, (a)lpha, (b)eta,
                          (R)eleased, (M)ature, (S)tandard
]]></verbatim>
<para>
それに、モジュールの説明と、これがリストに含まれるべき理由を記述します。
何も答えが返って来なければ、次の更新で、モジュールリストに掲載されるで
しょう。<code>modules@perl.org</code> に subscribe しようとしないようにしてくだ
さい。これはメーリングリストではないのです。我慢してください。
</para>
</item>
<item><itemtext>clpa にアナウンスする</itemtext>
<para>
リリースしたことを世界中にアナウンスしたいという野望があるなら、モデレー
トされている、<code>comp.lang.perl.announce</code> ニュースグループにアナウンス
を投稿してみましょう。
</para>
</item>
<item><itemtext>バグをなおす!</itemtext>
<para>
ユーザが集まってくると、バグレポートが送られて来ます。運がよければ、パッ
チを送ってくれるでしょう。ソフトウェアプロジェクトのメンテナンスという
喜びが待っています ...
</para>
</item>
</list>
</sect2>
</sect1>
<sect1>
<title>AUTHOR</title>
<para>
Simon Cozens, <code>simon@cpan.org</code>
</para>
</sect1>
<sect1>
<title>SEE ALSO</title>
<para>
<link xref='perlmod'>perlmod</link>, <link xref='perlmodlib'>perlmodlib</link>, <link xref='perlmodinstall'>perlmodinstall</link>, <link xref='h2xs'>h2xs</link>, <link xref='strict'>strict</link>,
<link xref='Carp'>Carp</link>, <link xref='Exporter'>Exporter</link>, <link xref='perlpod'>perlpod</link>, <link xref='Test'>Test</link>, <link xref='ExtUtils::MakeMaker'>ExtUtils::MakeMaker</link>,
<xlink uri='http://www.cpan.org/'>http://www.cpan.org/</xlink>,  Ken Williams' tutorial on building your own
module at <xlink uri='http://mathforum.org/~ken/perl_modules.html'>http://mathforum.org/~ken/perl_modules.html</xlink>
</para>
</sect1>
</pod>
