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

第26回 ShipIt:モジュールのリリースをもっと手軽に

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

CPANにモジュールをアップロードする前に

第23回から続けてきたシリーズの一環として,今回はモジュールをCPANにアップロードするときのツールをまとめてみます。おそらくこのようなツールに興味を持つような方なら当然 perlnewmodperlmodlibあるいはCPANやPAUSEについてのよくある質問のページ※1くらい読んでいるでしょうから大丈夫だろうとは思っていますが,今回とりあげるツールは使い方を間違えると周囲に多大な迷惑をかける可能性があります。一度CPANにアップロードされたファイルは,たとえミスであっても数日中には世界中のミラーにコピーされますし,BackPANと呼ばれる保管庫には半永久的に保存されますので,うっかり無意味な(あるいは部外秘の)モジュールを公開してしまうことがないよう,また,ほかの人の迷惑になるような名前空間を占有してしまわないよう,実際に試してみる場合はなるべくそれぞれのモジュールのソースコードを読んで,おおよその挙動を把握してからにすることをおすすめします。また,ここからはみなさんが何かCPANにアップロードできるモジュールを持っているという前提で話をしますので,そのようなモジュールがない方はまず先に名前をあげたドキュメントやFAQを参考に,何かモジュールを書いてみるところから始めてください。

※1

http://www.cpan.org/misc/cpan-faq.html#How_contribute_modules
http://www.cpan.org/modules/04pause.html

リリース前の定型処理

さて,はじめてモジュールをアップロードするときにせよ,アップロード済みのモジュールを更新するときにせよ,モジュールをCPANにアップロードするときにはいくつかお決まりの手順をふむ必要があります。たとえば,CPANには名前もバージョンも同じディストリビューションは二度とアップロードできない決まりになっているので,少なくとも更新の際にはディストリビューションのバージョンを付け替える必要がありますし,同じ理由でMETA.ymlなどのメタデータや,Changesのような履歴も更新しなければなりません。壊れたモジュールをリリースしてしまうことがないようにリリース前にはかならずテストを実行しておきたいところですし,バージョン管理システムを使いこなしている人ならタグを切ったりアーカイブを保存したりといった作業も発生します。そこまですませていよいよファイルのアップロード,というこの作業自体も毎度おなじみの定型処理ですね。

ミスをしたときの影響の大きさを考えると,ある程度までは目視しながら手を動かしたほうが安心できますが,それにしてもこのような作業を毎回手で行うのはいささか面倒ですし,手作業のままでは作業漏れも起こります。そのため,この分野も昔から多かれ少なかれ処理を自動化する試みが繰り返されてきました。

たとえば,ExtUtils::MakeMakerを使っている場合,アーカイブを作成するときの処理の多くはmake distひとつで片付けられるようになっています。実際にどのような処理が行われているかはMakefileに書いてある通りですが,たとえばディストリビューションをアーカイブするための作業ディレクトリを掘って,そこにMANIFESTに指定されているファイルをコピーし,そのディレクトリ内でMETA.ymlを作成,そのMETA.ymlをMANIFESTに追加,そのディレクトリをtarで固めて作業ディレクトリを削除,そのtarをさらにgzipで圧縮,というのがよくある作業の内訳になりますModule::Buildの場合は./Build distで同じようなことができます)⁠

また,make distのかわりにmake disttestを実行すれば,ふだんの作業ディレクトリではなくアーカイブ用のディレクトリのなかでテストを実行できますし(このようにすることでテストが配布対象外のファイルに影響されなくなります)⁠make manifestでMANIFESTファイルを更新したり,make distcheckでMANIFESTされていないファイルの確認をできたりもします(これらは実際にはExtUtils::Manifestというモジュールの機能を利用しています)⁠Windows環境向けにzipで固めたアーカイブがほしければmake zipdist,ppm(Perl Package Manager)というPerl用パッケージ管理システム向けのメタファイルを作成したければmake ppdという具合に,CPAN以外のパッケージ管理システムのこともある程度までは考慮されています。

CPANへのアップロード

とはいえ,ExtUtils::MakeMaker(やModule::Build)が面倒を見てくれるのは汎用的なディストリビューションの作成(とインストール)まわりくらいなので,CPANへのアップロードにはもっぱら別のツールが利用されてきました。

Perlで書かれた最初期のものとしては,ニール・バウアーズ(Neil Bowers)氏が1998年に公開したcpan-uploadというスクリプトがあげられます。これはFTPでPAUSEのincomingディレクトリにファイルをアップロードしたあと,HTTPでPAUSEのフォームを叩いてアップロードしたファイルと作者を紐づけるというもので,PAUSEのIDやパスワードは毎回コマンドラインオプションで指定してもかまいませんが,ふつうはホームディレクトリに.pauseというファイルを用意して,そこにユーザ名やパスワード,⁠FTP時に送信する)メールアドレスなどを書いておきます(.pauseはほかのユーザから見えないようにパーミッションのチェックが行われますが,それでは不都合がある環境の場合はスクリプトに手を加えるか,毎回パスワードなどを入力するようにしてください)⁠.pauseファイルが用意してある場合の一般的な作業の流れはおおよそこうです。

> cd Your-Distribution-Name
> perl Makefile.PL
> make
> make disttest
> make dist
> cpan-upload -verbose Your-Distribution-Name-0.01.tar.gz

このcpan-uploadは長らく標準的なアップロードの仕方として紹介されてきましたが,FTPでアップロードしたファイルをあとからHTTP経由で紐づけるというやり方は(歴史的には意味があったにせよ)いささか冗長です。そのため,2006年にはLiveJournalの創始者として知られるブラッド・フィッツパトリック(Brad Fitzpatrick)氏が直接HTTP経由で投稿できるように改造したものをcpan-upload-httpの名前でCPANにアップロードします。

これはファイル名(と内部の実装)が変わっただけで,使い方や設定の仕方についてはcpan-uploadと同じなのですが,cpan-upload-httpにもまだ弱みはありました。これらのスクリプトはCPANからインストールしようと思うと一手間かける必要がありましたし※2)⁠ほかのモジュールやスクリプトから利用する場合には(移植性の低い)system関数などを経由しなければなりません。

そのため,2009年にはリカルド・シグネス(Ricardo Signes)氏がcpan-upload-httpをさらにリファクタリングして,CPAN::Uploaderというモジュールをリリースしました。これにもcpan-uploadというコマンドが付属していますが,こちらはニール・バウアーズ氏のオリジナルとは異なり,HTTP経由でファイルをアップロードしてくれるため,いまではcpan-upload-httpをわざわざダウンロードしてくる必要は(同名のコマンドを直接呼んでいるツールを利用する場合を除いて)ほとんどなくなりました。.pauseファイルの書式はもともとのcpan-upload(やcpan-upload-http)と同じですので,従来のスクリプトを利用していた方はそのまま移行できます。

※2

cpan-upload-httpのようなスクリプトをCPAN経由でインストールするには「cpan BRADFITZ/cpan-upload-http-2.4.tar.gz」のように作者のPAUSE IDを含めた完全なディストリビューションファイル名を指定する必要があります。

著者プロフィール

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

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

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

コメント

コメントの記入