Perl界隈でかなり前評判が高かった 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 用デブで」みたいに一言でリクエストできるのがよいかんじです。