整理するためのメモ。
- よくある問題: プロジェクトごとの依存モジュールの管理
- 全環境共通でインストールするとモジュールのバージョンが分けられない
- 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
経由で立ち上げるように書いておいて、そこ経由でしか立ち上げないようにしておけばミスも少なくなる気がする。