訳あって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
を置く位置に気をつけたほうが良いでしょう.