Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

いい感じに@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があったらそこがプロジェクトルートとみなして探索を終了します。とりあえず、自分で使うのに十分なぐらいで作っているので適当です。

追記

CPANに上げておきました。