mod_perl und @INC
Chris
- perl
Hallihallo,
ich versuche gerade von CGI auf mod_perl umzusteigen und habe natürlich ein Problem :) Gegoogelt habe ich schon eine Menge, aber leider nichts funktionierendes gefunden.
Bisher habe ich mit
use lib '../modules';
mein Modulverzeichnis eingebunden, und konnte mich darauf verlassen, dass "." das korrekte Verzeichnis ist. Das ist unter mod_perl nicht mehr so.
"." ist jetzt "/" und die Module sind unauffindbar. Absolute Pfade möchte ich nicht benutzen.
Eine Lösung, die ich gefunden habe, ist per FindBin:
use FindBin;
FindBin::again();
use lib "$FindBin::Bin/../modules";
Die again()-Funktion ist extra für mod_perl erstellt worden. Leider gibts in "$Bin" das korrekte Verzeichnis erst nachdem einmal FindBin::again() aufgerufen wurde. Und da ein "use" ein "BEGIN"-Block ist, geht auch dieser Versuch schief. :( Es geht, wenn ich vorher ein Dummy-Skript aufrufe, das einfach nur FindBin::again() aufruft, und hoffe, dass mein richtiges Skript im gleichen Child-Prozess des Apachen läuft...
Zweite Lösung, die nicht tut:
use File::Basename;
use lib dirname($0).'/../modules';
Geht leider auch nicht, weil dirname() evtl. vorhandene symbolische Links nicht berücksichtigt, und genau die habe ich.
Wie löst ihr das Problem? Gibt es eine halbwegs elegante Lösung?
Grüße
Chris
Eine Lösung, die ich gefunden habe, ist per FindBin [...] Die again()-Funktion ist extra für mod_perl erstellt worden.
Das lese ich aber anders:
"This is a problem under mod_perl and other persistent Perl environments, where you shouldn't use this module."
Gibt es eine halbwegs elegante Lösung?
CK hat mal was geschrieben: http://forum.de.selfhtml.org/archiv/2005/10/t117825/.
Eventuell hilft auch File::Spec: http://perldoc.perl.org/File/Spec.html.
Ansonsten gibt's einen Eintrag im HowTo "CGI nach mod_perl":
http://perl.apache.org/docs/1.0/guide/porting.html#Name_collisions_with_Modules_and_libs
Siechfred
Hallo Siechfried,
Eine Lösung, die ich gefunden habe, ist per FindBin [...] Die again()-Funktion ist extra für mod_perl erstellt worden.
Das lese ich aber anders:
"This is a problem under mod_perl and other persistent Perl environments, where you shouldn't use this module."
Dann interpretieren wir das wohl unterschiedlich. Kurz nach dem von dir zitierten steht:
"To make sure that FindBin will work is to call the again function"
Und wie gesagt, das funktioniert auch. Nach dem Aufruf von again() stimmts... Aber auch das nur dann, wenn die BEGIN-Blöcke schon abgearbeitet sind. Danach wird offensichtlich der Wert von "$0" nochmal geändert.
CK hat mal was geschrieben: http://forum.de.selfhtml.org/archiv/2005/10/t117825/.
Das hatte ich schon gelesen. Ich hatte nur gehofft, dass es etwas gibt, was 100%ig ohne absolute Pfade auskommt. Aber diese Lösung ist schon gut, immerhin nur 1 Mal was anpassen.
Ein bisschen rumprobiert habe ich noch, und bei mir funktioniert das auch:
use Cwd qw(abs_path);
use File::Basename;
use lib abs_path(dirname($ENV{'SCRIPT_FILENAME'}).'/../modules');
Sieht zwar nicht besonders schön oder elegent aus, aber es funktioniert bei mir ohne Kenntnis eines absoluten Pfades. Jetzt muss man sich nur noch auf $ENV{'SCRIPT_FILENAME'} verlassen können. Kann man das?
Grüße
Chris