DebianでCPANのモジュールを利用する

DebianではCPANのモジュールもパッケージとして提供されていますが、もちろんオフィシャルには提供されていないものもたくさん存在します。そういうモジュールたちを利用したくなったときに、どうやるのが正しい方法なのかがいまいちわかりませんでした。
そこで少し調べてみたことをメモしておきます。素人なので間違っていたらご指摘を歓迎します。また、2008/05/24時点でのDebian testingで調べました。システム標準のPerlは先日5.10に更新されました。

  • 自分でPerlをインストールする
  • dh-make-perlを使ってローカルパッケージを作成する
  • CPAN++を使う

おそらくCPAN++が現状モダンな方法なのではないかと思っています。

自分でPerlをインストールする

Perlのソースを持ってきて自分でビルドし、ホームディレクトリや/usr/localなど適当な場所にインストールする方法です。PATH環境変数ではインストールした方のperlが先に来るように指定します。
Debianのパッケージシステムに縛られないし、ホームディレクトリなら一般ユーザ権限でどうにでもでき、第一システムに影響を与えないので気持ち的には楽です。ただ、sudoなどでroot権限で作業する時、本来システム標準のperlを期待されている処理で独自のperlが動いてしまい、変なことになったりしないかは気になります。それから、

perl -e 'print join(":", @INC)'

とかするとわかりますが、システムのperlは@INCに/usr/local/lib/perl/5.10、/usr/local/share/perl/5.10などが含まれているので、/usr/localに入れる場合はそちらに変なものを混ぜないようにしないといけません。

dh-make-perlでローカルパッケージを作成する

おそらく以前からスタンダードの方法なのだと思います。ただ、Perlモジュールの依存関係が複雑になると自分で必要なものをすべて集めてdh-make-perlでパッケージ化するのは大変そうです。この点については、cpan2pkgというツールも公開されているようです。

CPAN++を使う

CPAN++というツールがどうやらPerl 5.10から本体に取り込まれて配布されているようです。Debian付属のPerl 5.10にも含まれています。cpanコマンドの代わりにcpanpで起動できます。CPANモジュールの検索、インストール、アンインストールなどが行えます。
これでインストールしたモジュールは/usr/local以下の上述したディレクトリにインストールされるため、インストール時にはsudoでパスワードを求められます。(/usr直下には入らないのかの確信が持てません。ここはcpanコマンドも同じです。)
CPAN++のもう一つの特徴は、各ディストリビューションに合わせたパッケージ作成モジュールが組み込めるようになっていることです。準備としてcpanpを使い、CPANPLUS::Dist::Debモジュールをインストールします。そして、たとえば

cpan2dist --format CPANPLUS::Dist::Deb Term::Encoding

とすると、~/.cpanplus以下にcpan-libterm-encoding-perlパッケージが作成されます。--installオプションもつけるとインストールまでやってくれます。パッケージに含まれるファイルは/usr/local以下にインストールされ、ドキュメントのみ/usr/share/doc以下に入るようです。
さらに、依存関係のあるモジュールを指定すると、依存関係をたどって作成してくれます。ただこの場合、--timeout 3600などとしてデフォルト300秒のタイムアウトをのばしておかないと途中でこけたりするようです。場合によっては--skiptestも必要かもしれません。
perldoc CPANPLUS::Dist::Debをみると、すでにビルドされたパッケージも配布していて、aptラインを追加するだけで利用できます。ただし数はそんなにはないようでした。
このようにみてきて、今のところの本命はCPAN++かなという理解に落ち着きました。きっとやり方はいくつもあって一口におすすめというのがないのかもしれませんが、このあたりどこかにまとまった説明があるとうれしい気がします。(探せてない可能性大ですが…)

追記

CPANモジュールをdebパッケージ化するによると、cpanpのプロンプトで

s conf dist_type CPANPLUS::Dist::Deb
s save

とするとインストールするときに自動的にdebパッケージ化してくれるとのことです。

追記2

このエントリを書いた後、Task::CatalystCPAN++を使ってdeb化し、いざ--installをつけてcpan2distを起動すると、依存しているパッケージを勝手に入れてくれたりはしないみたいでした。ちゃんと作成はされてるのに。作成されたたくさんのdebパッケージをどうやって依存関係順にインストールすればいいのやら。ということで、成功談ではありません。あしからず。

追記3

スレッドテンプレの記事で、ローカルのパッケージをaptでインストールする方法が記載されていました。今度チャレンジしてみます。

追記4

CatalystCatalyst::Manual::Introには、cat-installというスクリプトが配られているからそれを使うのがいいと書いてありました。PlaggerとかCatalystとか、依存がやたら多いものをいじる時には汚してもいい自前インストールが結局のところ正しいのかもしれません。