Modulino に FindBin を使う限界

もし Modulino とそれが使う他のモジュールが同一のディレクトリツリー(もしくはサイトのデフォルトライブラリパス)に存在する場合は、FindBin だけでも対応は可能です。

しかし、ライブラリディレクトリが複数存在する状況では、 FindBin だけでは全ての Modulino の @INC を矛盾なく調整しきれない場合があります。

以下に具体例を挙げます。

% tree 
.
├── libA
│   └── my_A.pm
└── subproject
    ├── libB
    │   └── my_B.pm
    └── libC
        └── my_C.pm    <-- これが後から加わった

最初に toplevel のプロジェクトのライブラリディレクトリ libA と、 subproject のライブラリディレクトリ libB があるとします。

2つの modulino, my_Amy_B は、最初は モジュールとしてもコマンドとしても問題なく動きます。 しかし、後から my_BlibC/my_C.pm を use した途端に、 最初の my_A が、ロードも実行も失敗するようになります。

my_A.pm

#!/usr/bin/env perl
package my_A;
use FindBin;
use lib "$FindBin::Bin/../subproject/libB";

use my_B;
1;

my_B.pm

#!/usr/bin/env perl
package my_B;
use FindBin;
use lib "$FindBin::Bin/../libC";

# ↓これを加えた途端に、A のロードが失敗するようになる
# use my_C;
1;

原因

この問題の原因は、FindBin が $0 の値に依存しているからです。

つまり、 my_A.pm を起動した時、$FindBin::BinlibA を指します。 この状態で my_B.pm の中で

use lib "$FindBin::Bin/../libC";

と宣言しても、足されるパスは ./libC となり、期待した subproject/libC にはならないのです。