$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

モジュール作成からCPANに上げるまでの手順

 この前WebService::Bitlyというモジュールを作ってCPANに登録したので、忘れないうちにそれを行なうまでの手順をメモしておきます。これからCPANモジュールを作る人の参考になればと思います。

0.いろいろなドキュメントを読んでおく

間違ったモジュールをCPANに上げると迷惑がかかるようなので、最低限下のドキュメントは読んでおいたらいいと思います。
PAUSE: The CPAN back stage entrance
perlnewmod - 新しいモジュールを配布するには - perldoc.jp

1.モジュール名を決めて、ひな形を作る

 まずモジュールの名前を決めます。CPANモジュールは、「このようなモジュールはこの名前空間」のような慣習があるようなので、それを考えながら決めます。
 名前が決まったら、モジュールのひな形を作ります。僕はModule::Starter::PBPを使いました。使い方は以下の通り。

% perl -MModule::Starter::PBP=setup         #一度目だけ初期セットアップ
% module-starter --module=WebService::Bitly #ひな形作成

これでひな形作成までは終わりです。

2.コード、ドキュメントを書く

 ひな形を作ったら、後はコード、ドキュメントをがりがり書きます。一通り作ってみて、ドキュメント→テスト→機能実装の順で開発を行なうとよさそうと思いました。今回自分はドキュメントを後回しにしていて最後に苦しんだので。。。
 また、モジュール作成時に他のモジュールを使ったら、依存モジュールとしてその都度Makefile.PLに記述します。今回はModule::Installを使ってMakefile.PLを記述したので、下のような感じに書きました。

use strict;
use warnings;
use inc::Module::Install;

name     'WebService-Bitly';
author   'Yuki Shibazaki <shiba1029196473@gmail.com>';
all_from 'lib/WebService/Bitly.pm';

requires 'URI';
requires 'URI::QueryParam';
requires 'LWP::UserAgent';
requires 'JSON';
requires 'Class::Accessor::Fast';
requires 'JSON';

test_requires 'Test::More';
test_requires 'Test::Class';
test_requires 'IO::Prompt';

auto_install;
WriteAll;

3.PAUSEアカウントの登録

 コードを書き終わったら、とりあえずPAUSEアカウントを登録します。申請してから一週間くらいかかります。PAUSE: The CPAN back stage entrance
 こんな僕が CPAN Author (一応) になるまで。 - (゚∀゚)o彡 sasata299's blogが参考になりました。

4.MANIFEST等のファイルを記述

 MANIFESTファイル、Changes、READMEなどのファイルを記述します。

MANIFEST

 次のようにすると、MANIFESTファイルを作る事が出来ます。

perl Makefile.PL
make
make manifest

ただし、これをするだけだとモジュールのディレクトリ以下にあるすべてのファイルをMANIFESTに加えてしまうため、よくありません。そこでMANIFEST.SKIPファイルをモジュールディレクトリ直下に作成します。MANIFEST.SKIPには除外したいファイルを正規表現で指定していくだけです。ただし、マッチしようとする文字列がディレクトリも全部含んだファイル名である事に気をつけてください。例えば、dummy/test.htmlだけをMANIFESTから除きたいとすると、次のように指定しなければなりません。

^dummy/test.html$

今回は次のようになりました。

~$
\.bak$
.git/
blib/
pm_to_blib
^\.prove$
^ignore\.txt$
^Makefile$
^MANIFEST\.
\.tar\.gz
\.lwpcookies
cover_db
WebService-Bitly-
\.shipit.*
Changes

変更履歴を書きます。書き方は自由です。今回は下のようになりました。

Revision history for WebService-Bitly

0.01    Sat Jul 24 10:23:50 2010
        First version.
README

 インストールの仕方などを書きます。基本はModule::Starter::PBPで作られた通りでいいのかな?

5.最終確認

 漏れがないかのチェックを行ないます。Perl モジュールリリースチェックリスト | nDikiが参考になりました。
 テストが通るかなどの確認もここで行ないます。

6.モジュールをアップロードする

 モジュールのアップロードにはshipitを使います。

インストール

次のようにしてインストールします。

#cpan-upload-httpのインストール。なぜか直接cpanでインストールできない
% wget http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/cpan-upload-http-2.4.tar.gz
% sudo cpanm cpan-upload-http-2.4.tar.gz
#AppConfig::Stdのインストール
% sudo cpanm AppConfig::Std
#ShipItのインストール
% sudo cpanm ShipIt
pauseの設定ファイルを記述

~/.pauseに下のように書いて、権限を600にします。

user username
password userpassword
mailto = user@example.com
chmod 600 ~/.pause
shipitの設定ファイルを記述

 モジュールのディレクトリでshipitコマンドを使うと、shipit --write-configを実行してくださいと言われるのでその通りにすると、以下のような.shipitファイルが出来ます。

# auto-generated shipit config file.
steps = FindVersion, ChangeVersion, CheckChangeLog, DistTest, Commit, Tag, MakeDist

# svn.tagpattern = MyProj-%v
# svn.tagpattern = http://code.example.com/svn/tags/MyProj-%v

# CheckChangeLog.files = ChangeLog, MyProj.CHANGES

 僕はgitを使っているので、次のように書き換えました。CPANにもそのままアップロードするようにしました。

steps = FindVersion, ChangeVersion, CheckChangeLog, DistTest, Commit, Tag, MakeDist, UploadCPAN
git.tagpattern = WebService-Bitly-%v
git.push_to = origin
shipit!

 最後はshipitコマンドを使って、アップロードします。いくつかの質問に答えていくだけです。

% shipit

まとめ

 CPANモジュールを作ると、ある種のプレッシャーがあるので、かなり勉強になります。今後もできるだけ作っていきたいなと思いました。
 今回初めて作った手順をまとめただけなので、間違っていたら指摘お願いします。