perlbrew+cpanmでPerl環境を丸ごとホームに置く

カジュアルPerl#2でmiyagawaさんが話してた
cpanm+perlbrewな環境をしばらく使ってみてめも
http://yusukebe.com/archives/10/04/21/075545.html

導入方法は色々なところに書かれてるので簡単に

cd ~#ホームじゃなくてもインストールしたいディレクトリで
wget http://xrl.us/perlbrew
chmod 744 perlbrew
./perlbrew install
$HOME/perl5/perlbrew/bin/perlbrew init
#指示に従って起動スクリプトにsourceを追加する.bashの場合は
echo "source $HOME/perl5/perlbrew/etc/bashrc" >> ~/.bashrc
. .bashrc
#インストール終わったら落としたスクリプトはいらない
rm perlbrew
which perlbrew #=>$HOME/perl5perlbrew/bin/perlbrew
perlbrew install perl-5.12.0 #かなり時間かかる
perlbrew switch perl-5.12.0
perl -v
perlbrew installed #入ってるperl一覧表示*が付いてるのが今使ってるperl

shebang

#!/usr/bin/env perl

次に今使ってるperlにcpanmをインストールする
これが結構すごくて、perlのバージョン毎に違うcpanmを持てる

#perl cpanm --self-upgradeと同じ意味
(5/23追記: 下のようにするとperlと同じディレクトリにcpanmが入るっぽい)
curl -L http://cpanmin.us | perl - --self-upgrade
cpanm -v

色々な方法でインストール出来るけど↓みたいな感じでインストール

cpanm --interactive YAML::Tiny

オプションで--interactiveつけないと全部デフォルトでインストールされるみたいだけどなんか怖いので--interactive付けて対話的に設定する方が安心かな

こんな感じでとっても便利なperlbrewなんだけど使ってるとcronとcgiでちょっと詰まった.基本的にはログインしてない時にperlを実行する時にはどうするか?って問題

cronでperlを使う

この状態でcronでperlスクリプトを動かすと、perlbrewでswitchしたperlを使ってくれない。cronで実行する時は環境変数が違うから当たり前か.crontabに以下のようにPATHを追加して解決

PATH=/home/ユーザー名/perl5/perlbrew/bin:/usr/bin:/usr/sbin:/bin:sbin

crontabはなぜか変数展開をしてくれないので PATH=$HOME/perl5/perlbrew/bin:$PATHみたいなことは出来ないので注意

cgiperlを使う

これは単純にshebangに、#!/home/ユーザー名/perl5/perlbrew/bin/perlと書くしかないと思う.もっとスマートな方法知ってる人が居たら教えてください.自分はなんかこれが気持ち悪かったので,cgiから使う時はデフォルトのperlを使うことにした.いみなw

追記

この他にも同じperlでもcpanモジュールを使い分けるlocal::libと、cpanmと組み合わせて既に入ってるcpanモジュールのアップデートが出来るcpan-outdatedってものがあるらしいけどとりあえず使わなそうなので保留