plackup -Iで一貫性のないモジュール読み込みになる場合がある
plackup -I
は、perl -I
と同様にinclude pathを追加できるオプションなのだが、ちょっと特殊な挙動になっていて、問題が起きる場合がある。
plackup -I
では、plackup
自身の実行時に使用するモジュールのinclude pathは指定できない。これはまあ当然なのだが、なんとplackup
の実行時に読み込まれたモジュールは、その後PSGIアプリケーションを実行する時点でも残ってしまっている。
これにより、「plackup
自身が読み込んだモジュールは、-I
で指定されたパスにあっても読み込まれない」ということになる。
さらにモジュールによってはやっかいな問題につながる。
たとえば古いCarp
モジュールではCarp::Heavy
を遅延ロードしているのだが、plackup
時に古いCarp
を読み込んで、しかし-I
で指定したパスには新しいCarp
が入っている場合、その後PSGIアプリケーション側でCarp::Heavy
を遅延ロードするようなことをすると、新しいCarp
のCarp::Heavy
は古いバージョンのCarp
とは互換性がないためdieするようになっているため、アプリケーションが落ちる。
なお回避策は簡単で、-I
オプションを使用せず、PERL5LIB=... plackup
とするだけである。-I
オプションはなくしてもいいのではないだろうか。