Subscribed unsubscribe Subscribe Subscribe

"cpanm -l"するとき"--no-uninst-shadows"で元々あるモジュールが消えないようにする

※追記しました! 最新版(1.0005以降)では起こりません


とっても便利なcpanm
"-l"オプションを使うと、local::libのように指定した任意のPATHにインストールできる。
けど気をつけないといけないことに、これをやると もともと入っていたモジュールが消えちゃったりする。
例えばperlbrewでデフォルトの場所にモジュールをインストールしていて

$ perl -MV=AnyEvent
AnyEvent
        /Users/sugyan/perl5/perlbrew/perls/perl-5.10.1/lib/site_perl/5.10.1/AnyEvent.pm: 5.271

となっていて、「ちょっと古いバージョンのを"$HOME/locallib"に入れて使いたい」と思って

$ cpanm -l $HOME/locallib http://search.cpan.org/CPAN/authors/id/M/ML/MLEHMANN/AnyEvent-5.2.tar.gz

とやると、

$ perl -MV=AnyEvent
AnyEvent
        Not found
$ PERL5LIB=$HOME/locallib/lib/perl5 perl -MV=AnyEvent
AnyEvent
        /Users/sugyan/locallib/lib/perl5/AnyEvent.pm: 5.2

という状態になり、めでたく$HOME/locallib以下には入るものの、もともとデフォルトの場所にあった最新バージョンが消えてしまう。


こうなって欲しくない場合は、"--no-uninst-shadows"オプションを指定する必要があるそうです。

$ cpanm AnyEvent
$ perl -MV=AnyEvent
AnyEvent
        /Users/sugyan/perl5/perlbrew/perls/perl-5.10.1/lib/site_perl/5.10.1/AnyEvent.pm: 5.271
$ cpanm --no-uninst-shadows -l $HOME/locallib2 http://search.cpan.org/CPAN/authors/id/M/ML/MLEHMANN/AnyEvent-5.2.tar.gz
$ perl -MV=AnyEvent
AnyEvent
        /Users/sugyan/perl5/perlbrew/perls/perl-5.10.1/lib/site_perl/5.10.1/AnyEvent.pm: 5.271
$ PERL5LIB=$HOME/locallib2/lib/perl5 perl -MV=AnyEvent
AnyEvent
        /Users/sugyan/locallib2/lib/perl5/AnyEvent.pm: 5.2
        /Users/sugyan/perl5/perlbrew/perls/perl-5.10.1/lib/site_perl/5.10.1/AnyEvent.pm: 5.271

こうすれば元のモジュールが消えること無く指定した場所にインストールできる!


詳しくは"perldoc cpanm"参照。

追記!

miyagawaさんが直して下さいました!ありがとうございます! ><
cpanminus 1.0005以降ではlocal::lib環境下でuninstall_shadowsが無効になり、もともと入っていたモジュールがアンインストールされることはなくなります。
http://github.com/miyagawa/cpanminus/issues/closed#issue/51
Automatically disable uninstall_shadows when local::lib is used. Fixe… · miyagawa/cpanminus@826dfcc · GitHub