いい感じに@INCにあれこれ追加するProject::Libsというのを書いた
テストスクリプトなどで、プロジェクトのlibディレクトリや、gitでサブモジュールを使っている場合は、依存するsubmoduleを@INCに追加するために
use FindBin; use lib "$FindBin::Bin/../lib"; use lib glob "$FindBin::Bin/../modules/*/lib";
みたいなのをいちいち書いていてわずらわしかったので、useするだけでいい感じに@INCに必要なものを追加するのを書いてみた。
use Project::Libs;
と、普通にuseすると、以下のような働きをします。
- スクリプトのあるディレクトリ、またはそれからひとつづつ上がっていったディレクトリのlibディレクトリ(FindBin::libsによる)
- 上記と同じ条件で、指定した名前のディレクトリ(たとえばextlibとか。詳細後述)
- しかし、ディレクトリを上がっていくのは、プロジェクトルートらしいディレクトリまで。それをどうやって判定するかは、デフォルトでは.git/.gitmodules/Makefile.PLのあるディレクトリということにしている。
- .gitmodulesからsubmoduleのパスを見つけて、それらを@INCに追加。
以下のようにすると
use Project::Libs lib_dirs => [qw(foo_dir)], project_root_files => [qw(.bar)];
foo_dirがあったらそれを@INCに追加し、.barがあったらそこがプロジェクトルートとみなして探索を終了します。とりあえず、自分で使うのに十分なぐらいで作っているので適当です。