CPANモジュールのインストール先を指定する

縁あって4年ぶりぐらいにPerlを触り始めました。前は共用サーバでCGI書いてただけなので、今時のPerlな知識は皆無。
まず引っ掛かったのがCPANモジュールのインストール。インストールしたモジュールは特定のディレクトリにまとめて、rsyncなりsvnで各サーバ間の同期を取りたいんだけど、これがなかなか厄介。
Plaggerのインストール(非RPM) - ヒビノキロク とか otsune's FreeBSD memo :: ユーザー領域にCPANをインストールする方法 を参考に$HOME/.cpan/CPAN/MyConfig.pmを設定してみたけど、何故か依存モジュールが/usr/libに入ろうとなさる。具体的にはDBIx::Classを入れようとしたら、Class::C3がどうにも/usr/lib以下に入ろうとするとか。

cpan2rpmは依存関係を自動で解決してくれないので挫折。このへんはわりと皆が苦労するところみたいなんだけど、どうにかならんもんですかね。はてなでは自動で依存関係を解決してrpm化するツールを自作してるみたいだけど、是非とも公開して欲しいところです。

yumで入るモジュールはyumでというのも考えたけど、CentOSなのでやめ。別にFedoraのでも問題ないとは思うんだけど、yumに登録されてないモジュールを入れる時に結局また同じ問題にぶつかると思ったので自力解決する方向で。

次に思いついたのが、「/usr/libとかに好きに入らせて、対象ディレクトリをsvnで管理」というアプローチ。ところが、Catalystが/usr/bin/catalyst.plを作ろうとすることを知って挫折。流石に/usr/binまではsvnで管理したくないっす。いろいろ入れてるうちに、また他のディレクトリとか出てきたら死んじゃう。

そこで再び$HOME以下にまとめる方向で検討。試行錯誤の結果、MyConfig.pmにこんな風に書くとわりといい感じでした。

  'make_arg' => q[PREFIX=/home/ryo/CPAN],
  'make_install_arg' => q[SITEPREFIX=/home/ryo/CPAN],
  'makepl_arg' => qq[PREFIX=/home/ryo/CPAN LIB=/home/ryo/CPAN/lib/perl5 INSTALLMAN1DIR=/home/ryo/CPAN/man/man1 INSTALLMAN3DIR=/home/ryo/CPAN/man/man3],
  'mbuildpl_arg' => q[./Build --install_base /home/ryo/CPAN],

参考にしたサイトとかにはmake_argの指定がなかったんだけど、それを入れたらかなり改善されました。それともこれって常識過ぎて書かれなかっただけなのかな。
他には、「'prerequisites_policy' => q[follow],」としてみました。依存モジュールをインストールするのがデフォルトになるのかな、これで。正直よく分かってない。


それから、.zshrcにこんな感じで記述。

export PATH=$PATH:$HOME/CPAN/bin
export PERL5LIB=$HOME/CPAN/lib/perl5:$HOME/CPAN/lib/perl5/site_perl:$HOME/CPAN/lib64/perl5/:$HOME/CPAN/lib64/perl5/site_perl
export PERL_AUTOINSTALL="--defaultdeps"

最後のは、CatalystやPlaggerのインストールでyes連打をしたくない (bokut.in) を参考に入れてみた。全部クリア出来るわけではないみたいだけど、これでEnter叩く回数は一気に減って快適になりました。


今のところ、設定はこんな感じ。ただ、

cpan -i DBIx::Class

すると、やっぱりClass::C3が/usr/libに入ろうとする。

cpan -i Class::C3::XS Class::C3 DBIx::Class

で下から順に入れてやると無事にインストールされてくれるんですが… 依存モジュールに対する引数の受け渡しがうまくいっていない模様。回避策が分からなかったので、コケたやつはあらかじめ入れておくことでひとまずの対策としました。このへん、うまい回避策があったら誰か教えて欲しいです。


そんなこんなで、こんなのをinstall_cpan.shとして書いてます。

cpan -i Class::DBI

cpan -i Class::C3::XS Class::C3 DBIx::Class

cpan -i Bundle::LWP

cpan -i Module::Build
cpan -i Catalyst::Runtime
cpan -i Catalyst::Devel
cpan -i HTML::Lint Test::WWW::Mechanize::Catalyst
cpan -i Catalyst::Plugin::Authorization::Roles Catalyst::Plugin::Session::State::Cookie
cpan -i Devel::Caller Devel::LexAlias
cpan -i Catalyst::Plugin::Session::Store::File
cpan -i Catalyst::Engine::Apache FCGI FCGI::ProcManager PAR Params::Validate Catalyst::Log::Log4perl Date::Calc Catalyst::Plugin::HTML::Widget Catalyst::Controller::FormBuilder Catalyst::Plugin::StackTrace Catalyst::Plugin::Prototype Catalyst::Plugin::Session::State::URI Catalyst::Plugin::Authentication::Store::DBIC Catalyst::Plugin::Authentication::Store::Htpasswd Catalyst::Plugin::Authorization::ACL Catalyst::Plugin::I18N Catalyst::Controller::BindLex Catalyst::Model::DBIC::Schema Catalyst::View::TT
cpan -i Task::Catalyst
cpan -i HTML::Entities

とりあえずインストールしたかったのは、Class::DBI, DBIx::Class, Bundle::LWP, Task::Catalyst。HTML::Entitiesは少しCatalyst叩いた時に要求されたので。まだまだ増えていくと思いますが、ひとまずこれで開発に着手します。


あと気になるのは、~/CPAN/lib/perl5/x86_64-linux-thread-multi/ ってディレクトリが出来てるとこ。これって、lib64の下じゃなくていいのかな。まだ設定マズいんだろうか。一応は動いてるから目をつぶっとくか…