My Favorite .deb

WEB+DB PRESS Vol.33Perl界隈でかなり前評判が高かった WEB+DB PRESS vol.33、読みました。やはり、ライブドアのインフラ設計の話が興味深かった。

特に、さらりと書かれている「新しいサーバーが用意されたときにすでに大量のCPANモジュールが入っている(しかもバージョン指定付き!)」というのがすばらしい。

うちの会社の場合、キャンペーン系の案件が多く、まっさらなサーバーにセットアップしていくことがひんぱんにあるのですが、毎回最初の CPAN 祭り がいいかげんめんどうだったりします。しかもそのサーバーのFWがセキュリティポリシー的に外に物を取りにいけなかったりすると、とたんにめんどくさくなります。

CPANPLUS を使いこなして、内部のどこかにミラーを作るなどするのが良いかなあと思ってたんですが、Debian パッケージ(.deb)を使うのがすげー楽ということに気づいてからは、もっぱら .deb love です。当然 Debian じゃないと使えないし、他に何かよい手があるかもしれないけど、しばらくはデブついていこうと思います。

まずはお気に入りのデブ集を作ります。たとえば mfdeb というフォルダに .debファイルを集めたとすると、新しい Debian なサーバーにそれを転送して、

# dpkg -i mfdeb/*.deb

これで全てが完了! cpanシェルでちまちま入れたり、CPAN.pm を使ったスクリプト書いたり(こういうの)、aptitude install なんとか を繰り返すより簡単に同じ環境が手に入ります。

.deb を集めるには?

例えば Imager を入れたいなあと調べる場合、

# aptitude search imager

とか、

# aptitude show libimager-perl

というようにして、目的のブツとその依存パッケージを把握します。とすると libimager-perl libfreetype6 libjpeg62 libpng12-0 libt1-5 libtiff4 libungif4g zlib1g このあたりが一式必要なパッケージだ、というのがわかると思います。ふつうの # aptitude install libimager-perl だと依存の面倒を見てくれるのですが、.deb集めの場合そこは自分でしなきゃなんないのが面倒。

で、そいつを http://ring.hosei.ac.jp/archives/linux/debian/debian/pool/main/ に行ったり、Googleで inurl:パッケージ名 とかして探し、落としてきます。このあたり、もっと簡単にしたいのだけど知らない。。誰か教えてほしい

好きな CPAN モジュールを .deb 化する!

実は、これが超簡単にできちゃうから .deb love なのです。dh-make-perl というのを使います。とりあえず、.deb 作りをするサーバーには # aptitude install dh-make-perl で、dh-make-perl を入れ解く必要があります。

ぼくが作業した環境だと、po-debconf がないとかいわれて、aptitude install dh-make-perl がコケたんで、ここから po-debconf 落としてきて

# dpkg -i po-debconf_1.0.2_all.deb

しました。

dh-make-perl というシェルコマンドがいっしょに入ります。これが任意のCPANモジュールをデブ化してくれます。その CPANモジュールが apt-line にあるない問わず作成できます。例えば、Text::Markdown なんかは apt-line にありません。で、こうやって作ります。

$ dh-make-perl --build --cpan Text::Markdown

これで、ごにょごにょやってくれて、最終的に libtext-markdown-perl_1.0.3-1_all.deb とゆーのが出来上がります。あとはこれをどっか別の Debianサーバーで #dpkg -i libtext-markdown-perl_1.0.3-1_all.deb すればよいわけです。

注意:さすがの dh-make-perl もCPANモジュールの依存は解決してくれません。 そのモジュールに依存CPANモジュールがあって、それがまだ入っていなかった場合、とちゅうでコケます。最初にそのモジュールを .deb化(そして、その作業マシンにインストール)しておく必要があります。

オリジナル CPAN モジュールを .deb化する

dh-make-perl でオリジナルモジュールをデブ化することもできます。応用して、既存CPANモジュールのオリジナルパッチを当てたバージョンをデブ化したいときとか有効です。

例えば DBIx::Simple っていうモジュールがあります。DBIx::Class に登場いただくほどではないようなちょっとした DB 接続をしたい場合、DBIx::Abstract より直感的で、最近のお気に入りです。ただしこれには致命的なバグがあって、Want.pm がすでに入っている場合 $db->select() とかが動きません。(1.26現在) バグレポートは送信済みで、現在修正作業中とのことですが、実はこれって、

--- DBIx/Simple.bad.pm  Wed Jun 28 02:43:05 2006
+++ DBIx/Simple.good.pm Wed Jun 28 02:43:52 2006
@@ -67,7 +67,7 @@
 
 sub abstract : lvalue {
     require SQL::Abstract;
-    $_[0]->{abstract} ||= SQL::Abstract->new if _want('RVALUE');
+    $_[0]->{abstract} ||= SQL::Abstract->new if _want('LVALUE');
     $_[0]->{abstract}
 }

…単純に右と左の間違え…なトホホ話だったりします。(というかこれだけのために Want 使うなと言いたい) こういうのを修正したオリジナル .deb を作るには、

$ wget http://search.cpan.org/CPAN/authors/id/J/JU/JUERD/DBIx-Simple-1.26.tar.gz
$ tar zxvf DBIx-Simple-1.26.tar.gz
$ vi DBIx-Simple-1.26/lib/DBIx/Simple.pm 好きに修正して...

$ dh-make-perl --build DBIx-Simple-1.26

と、モジュールディレクトリを指定してあげることで作れます。

これ標準搭載?

「このモジュールは標準モジュールだろうか?」みたいな時があると思いますが、Module::Corelist を入れておけば、同梱の corelist が入るので、以下のように標準か非標準か、そしてまた標準になったのはどのバージョンからか、簡単に調べられます。

$ corelist Net::SMTP Data::Swap

Net::SMTP  was first released with perl 5.007003
Data::Swap  was not in CORE (or so I think)

ちゃんと入ったか?

あまりに一瞬でがっつり入るので、心配なときは perldoc -l して、入ったパスを見て確認してます。cpan シェルで入れた時と違って、Debian パッケージぽいところに格納されるのが特徴です。

$ perldoc -l Template

/usr/lib/perl5/Template.pm

だいたいこんなところを押さえていれば快適な .deb 生活が送れるのではないかと思います。慣れると、サーバーのセットアップを行うのが別の担当者であっても、「今回はいつものデブ + catalyst 用デブで」みたいに一言でリクエストできるのがよいかんじです。