Scrapdiary

DesigningとEngineeringの架け橋

CGIで稼動させる時にPathを自動取得する

開発・テスト機と本番機でユーザやディレクトリ構造が違う場合、設定値を書き直すのが面倒だったので、無い知識をフル活用。

DocumentRootの上位ディレクトリにアプリの実体ファイルを置くという設計。

/home/user/public_html/hoge.cgi
/home/user/my_app/foo.pl

例えばhoge.cgiで$ENV{'DOCUMENT_ROOT'}を参照すると/home/user/public_htmlという値が返ってくる場合、DocumentRootのディレクトリ部分(ここでは「public_html」の部分)を削除してアプリ用のディレクトリを追記する方法をとる事に。

$ENV{'DOCUMENT_ROOT'}で取得可能な値を使って正規表現で加工。

$HOME = $ENV{'DOCUMENT_ROOT'};
$HOME =~ s/(\/(\w+))$//; # ホームディレクトリを抽出
$APP_HOME = $HOME . "/my_app"; # アプリのディレクトリを指定


でも、こんな事しなくてもFindBinモジュール*1を使えばもっと簡単に出来るんだそうです。

use FindBin;
$APP_HOME =  "$FindBin::Bin/../my_app";

参考:

モジュールに依存 (したくない | できない) 環境なら前者の方法も使い道があるかなw

というか相対と絶対の中庸みたいな/home/user/public_html/../my_appというパス指定が出来るということに今更ながら感動。ってことは自分が想定しているケースだったら

$APP_HOME = $ENV{'DOCUMENT_ROOT'} . "../my_app";

でOKってことじゃないですか。トホホ・・・正規表現もつかわず簡単。

*1:ちなみFindBinはperl5.003_07の頃からコアモジュールだそうで、幅広い環境で使えそうですね。