その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

訳あってcarton等を利用せずに,しかしきれいなperl環境を保ったままモジュールをインストールしたいんですけどって時

plenvやperlbrew等できれいなperl環境を利用している際に,Perl::Critic (例えばエディッタのsyntax checkingに引っ掛けているようなシチュエーション) やLなどの自分の環境でだけ動かすようなモジュールを環境グローバルに入れたくないという場合が生きているとあるでしょう.かと言って複数人で開発していてcpanfileをrepositoryで管理しているようなプロジェクトだとcarton/carmelでインストールするというのも微妙.そういう時にどうするか,と言う時の話です.

僕は雑な人間なので,そういったモジュールを利用したい時は普通にcpanm L​とかやってしまいがちなんですが (なんと前提が崩れた),真面目にやるときはdirenvを使ってPERL5OPTを設定するようにしています.

例えば

$ cpanm -l mydist L

という風に,-lオプションとともに任意のディレクトリの以下にモジュールをインストールしておいて,

export PERL5OPT="$PERL5OPT -I/path/to/mydist/lib/perl5"

みたいな感じで-Iオプションによってincludeするパスを指定したPERL5OPT.envrcに書き込んでやる.この時指定するパスは,モジュールをインストールした先のパスを指定する.
そうすると,.envrcが置かれているディレクトリ以下ではこのPERL5OPTが有効になるので,-l​オプションと共にインストールしたモジュールが実行時にincludeされ (PERL5OPT-Iに指定したディレクトリ以下が走査される),自動的に利用可能になります.
注意としては,PERL5OPTに書く-I​オプションに与えるパスはフルパスである必要があるということです.これが相対パスだとincludeするパスの位置の決定がperlを実行するディレクトリに依存してしまい正しく動作しなくなります.

これできれいな環境を保ちながら任意のモジュールを任意の場所にインストールしつつ,自分の環境でだけ有効にすることができる.やりましたね.

追記: PERL5LIBを使う方法

ここまでPERL5OPTを使う方法を書いたのですが,冷静に考えてみればPERL5LIBを使ったほうが役割的に正しいのでしっくり来ることに気づきました..envrcに以下のように書くと良い;

export PERL5LIB="/path/to/mydist/lib/perl5:$PERL5LIB"

注意としては,PATHなどと同じでPERL5LIB上では先に書いたものが優先されるということでしょうか.つまり先に書いたパスから評価されてゆき,そこに対象となるモジュールがあった場合はそれが利用されます.適宜,オリジナルの$PERL5LIBを置く位置に気をつけたほうが良いでしょう.