perlbrewを利用したプロジェクトごとのPerl環境管理

整理するためのメモ。

  • よくある問題: プロジェクトごとの依存モジュールの管理
  • 全環境共通でインストールするとモジュールのバージョンが分けられない
  • local::libã‚„cartonを使ってプロジェクト専用のインストール領域を作るのが良い
  • しかし実行するPerlのバージョンが違うと動かなかったりするし
  • だったらPerlそのものもプロジェクトごとに管理した方が
  • というわけでプロジェクト専用のPerlã‚’perlbrewでインストールして使おう
    • ビルドに時間かかったりもするけどまぁ最初の一回だけだし我慢

手順

既にperlbrew自体は標準の方法でインストールしておいていて使えてる、という前提で

$ cd <PROJECT_ROOT>
$ export PERLBREW_ROOT=${PWD}/perl5
$ perlbrew init
$ source ${PERLBREW_ROOT}/etc/bashrc
$ perlbrew install 5.16.2

みたいなかんじでプロジェクトディレクトリ内にPERLBREW_ROOT環境変数をセットした状態でインストール。するとそこ以下を作業ディレクトリとしてインストールしてくれる。
その後、実際に使うperlにswitchしたいところだけど、普通にperlbrew switchをすると、$HOME/.perlbrew/initに諸々の環境変数情報が書き込まれることになり、下手すると普段使っているperlbrew用の環境を壊してしまう。PERLBREW_HOME環境変数をセットしておけばそこ以下にinitファイルを作って使うようにしてくれるので、セットしておく。

$ export PERLBREW_HOME=${PWD}/perl5
$ perlbrew switch 5.16.2

これで、あとは<PROJECT_ROOT>/bin/env.shに

#!/bin/sh

# require perlbrew
if ! which perlbrew; then
    source ${HOME}/perlbrew/etc/bashrc
fi

# set environment for PROJECT_ROOT
PROJECT_ROOT=$(dirname $(dirname $0))
PERLBREW_ROOT=${PROJECT_ROOT}/perl5
PERLBREW_HOME=${PROJECT_ROOT}/perl5

# use switched perl
source ${PERLBREW_ROOT}/etc/bashrc

exec "$@"

といったシェルスクリプトを用意しておいて、perl絡みのコマンドを常にこれを経由して使うようにすれば、プロジェクト内で完結する環境で動かすことができる。

$ perlbrew list
  perl-5.10.1
  perl-5.12.4
* perl-5.14.2
  perl-5.16.0
  perl-5.16.1
  perl-5.16.2
  perl-5.17.3
  perl-5.8.9
$ which perl
<HOME>/perl5/perlbrew/perls/perl-5.14.2/bin/perl

$ cd <PROJECT_ROOT>
$ ./bin/env.sh perlbrew list
* perl-5.16.2
$ ./bin/env.sh which perl
<PROJECT_ROOT>/perl5/perls/perl-5.16.2/bin/perl

$ curl -L cpanmin.us | ./bin/env.sh perl - App::cpanminus
$ ./bin/env.sh which cpanm
<PROJECT_ROOT>/perl5/perls/perl-5.16.2/bin/cpanm
$ ./bin/env.sh cpanm --installdeps .
$ ./bin/env.sh plackup


開発時にはProcfileに、デプロイ用にはdaemontoolsのrunスクリプトにenv.sh経由で立ち上げるように書いておいて、そこ経由でしか立ち上げないようにしておけばミスも少なくなる気がする。