Time::Piece 1.21 から install される場所が変わって嵌ったりした。

Time::Piece が古いと localtime 事件みたいのがあるから cpanfile に

requires 'Time::Piece', '>= 1.20';

このように新目の version を指定しておくことがあるかもしれない。ただ、これが

requires 'Time::Piece', '== 1.20';

になっていて、かつ carton ではない時に ( carton の場合は調べてない ) 何かの拍子に 1.21 移行のものが入ってしまっていて嵌った。

説明

1.21 移行は Makefile.PL が変わっていて

'INSTALLDIRS' => ( ($] >= 5.009005 and $] < 5.011) ? 'perl' : 'site'),

となっている。つまり新し目の perl だと site 以下に入る。しかし 1.20 以下では

'INSTALLDIRS' => ( $] >= 5.009005 ? 'perl' : 'site' ),

となっている。つまり新し目の perl だと perl 以下にはいる。

なので、== 1.20 を cpanfile で期待している状態で 1.21 移行が入っていると site 以下が優先的に見られるので、perl 以下に 1.20 が入っているとしても == 1.20 を満たせず cpanm が失敗してしまう。

まとめ

== 1.20 なんてやめよう