プロジェクトのルートディレクトリを探す
ある Perl のプロジェクトで、.t ファイルの冒頭で @INC をいじっているものがあった。曰く
% ls Changes MANIFEST MANIFEST.SKIP Makefile.PL lib/ t/ % cd t % prove header.t
みたいに cwd (current working directory) を考えずにテストを実行したい、というはなしらしい。
たしかに便利そうだけど、個々の .t に書いていくのは嫌なので、こんなものを project-root という名前で $PATH が通ったところに置いてみた。
#! /usr/bin/env perl
use strict;
use warnings;
use Cwd;
my @BASENAMES = qw(.hg .git t);
sub project_root {
my ($absolute) = @_;
for (my @list = split '/', $absolute; @list; pop @list) {
my $result = join '/', @list;
for (@BASENAMES) {
if (-e "$result/$_") {
return $result;
}
}
}
return;
}
my $path = project_root(cwd());
if ($path) {
print "$path\n";
} else {
exit(1);
}
先の例だと、こう使える。
% cd t % prove -I `project-root`/lib header.t
どこがプロジェクトのルートか、という判断方法はかなり発見的で
- .hg (Mercurial)
- .git (Git)
- t (Perl のテストを置くデファクトスタンダード)
のどれかを探しているだけだ。Subversion で管理された Java のプロジェクトとかだと、また @BASENAMES をいじる必要がある。
ごく小さいスクリプトだけど、cd ../../ のかわりに cd `project-root` とか、エディタのなかから chdir `project-root` && prove -l t/ とか、わりと使い道はあるんじゃないかと思います。
