設定ファイルに絶対パスを書くのを避けたい

アプリの置いてあるパスを絶対パスで取得したい。
楽なのはconfにPerlSetEnvで書いてプログラムで$ENV{APP_PATH}とかで受け取ればいいけど、confに絶対パス書くのを避けたい。

案1:File::Spec->rel2absを使ってみる

大抵のwafで作ったアプリは起動時に1回だけ走る処理がある。Catalystのsetupみたいな。
そこで絶対パスを取得してはどうか。

$APP_PATH = File::Spec->rel2abs('..');

DocumentRootに指定したパスの1個上がアプリホームだと仮定するとこうなる。
アプリパス:/hoge/app
DocumentRoot:/hoge/app/htdocs
的な。


一見正しく動いてくれるけど、しばらくすると確実にエラーる。
理由は、子プロセスは大抵複数あるけど、その子プロセスそれぞれにおいて「起動時に1回だけ走る処理」が走るから。
例えば、子プロセス1に http://example.com/ でアクセスしたら $APP_PATH は /hoge/app/htdocs/.. になるが、
子プロセス2が生まれた後、初めてのアクセスが http://example.com/user/ だったら、 $APP_PATH は /hoge/app/htdocs/user/.. になる。
いやーハマったハマった。


httpd -X とかするとシングルプロセスで走るけど、デバッグ用だし重いのでだめぽ
というのを柔道家から教えてもらった。

案2:先にconfにモジュール読み込む命令書く

LoadModuleか何かで、起動時に「このファイル先に読め」的なことができるらしい。これも柔道家から教えてもらった。
が。
アプリ内で使うモジュール全部書くんですと。アプリ本体はもちろん、DBIx::ClassからTemplateまで。他も全部。
そうしないとメモリ効率が悪くなるんだそうで。
ごめんなさい逃げさせてください。

案3:`pwd`とかCwd使ってみる

案1と同じ理由で死亡。


結局confに絶対パスのベタ書きしてる今。避けたい。