cartonを使ってアプリケーションの依存関係を解決する際にちょっとはまったのでメモ。

複数のPerlがインストールされている環境、具体的には/usr/local/bin/perlが過去の遺産の5.8.8で、どこか新しいところに /path/to/perl-5.16.3/bin/perl とかをインストールしている環境で、新しい方のperlにcartonを入れて実行したら実行時にエラーになった。

エラーログを よく見るとモジュール読み込みに失敗していて、なぜか参照パスが/usr/local 以下とかになってる。

なんでやー、と思っているとどうもcartonを実行した際に以下のように絶対パスで実行していて:
/path/to/perl-5.16.3/bin/carton exec -- ....
はて、と考えると/usr/local/bin/cpanmが存在していて、どうもそれを使っているくさい。/path/to/perl-5.16.3/bin にはパスを通してなかったので、そこで取り違えが起きたということみたい。

/usr/local/bin/cpanmを消せばいいんだけど、なんかあとで言われるのも嫌なので、その辺りも含めて色々やるラッパースクリプトからcartonを呼び出す事にして、ざっくり以下のようにしておいた

local $ENV{PATH} = join ":", perl_binpaths(), $ENV{PATH};
exec("carton", ... ) 
 perl_binpath() は こんな感じ

use Config ();
sub perl_binpaths {
my %hash = map {
($Config::Config{$_} => 1)
} qw(installbin installscript installsitebin installsitescript);
return keys %hash;
}

まぁここまでやらんで、普通に PATH=/path/to/perl-5.16.3/bin:$PATH でもいいとは思う。癖です。