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を遅延ロードするようなことをすると、新しいCarpCarp::Heavyは古いバージョンのCarpとは互換性がないためdieするようになっているため、アプリケーションが落ちる。

なお回避策は簡単で、-Iオプションを使用せず、PERL5LIB=... plackupとするだけである。-Iオプションはなくしてもいいのではないだろうか。