2009-07-22 4 views
3

J'essaie de migrer des scripts CGI vers mod_perl en utilisant ModPerl::Registry.Comment ajouter un chemin de lib spécifique à un script dans mod_perl?

Les scripts utilisent des modules qui se trouvent dans le même répertoire que le script, mais puisque le répertoire mod_perl est ailleurs, cela ne fonctionne pas.

J'ai essayé d'utiliser FindBin ajouter à la @INC, mais voici ce que FindBin ressemble à:

$FindBin::Bin: /usr/sbin 
$FindBin::Script: httpd 

Ce qui ne sert à rien du tout.

Alors, y a-t-il un moyen pour le script de comprendre où il se trouve, et d'ajouter ce répertoire à @INC? Idéalement, tous les autres scripts utilisant le même serveur Apache n'obtiendraient pas ce répertoire ajouté à leur @INC.

Répondre

5
use File::Basename; 
use lib dirname(__FILE__); 
+0

Je ne suis pas sûr que '__FILE__' ne soit pas modifié par' mod_perl'. Si c'est sûr, alors il n'y a pas besoin de 'BEGIN' &' unshift' (d'ailleurs, il ne devrait pas y avoir de deux-points après BEGIN –

+1

Cela fonctionne: utilisez File :: Basename; utilisez lib dirname (__FILE__); Votre la suggestion ne fonctionne pas, mais elle m'a mis sur la bonne voie –

+0

La suggestion de David n'a pas fonctionné à cause du colon après 'BEGIN' –

1

Avez-vous un ou LocationDirectory pour chaque script ou ne ils vivent tous au même endroit? Si l'ancien, j'utiliser PerlSetEnv

Alias /apps/thisone/ /srv/http/site/apps/thisone/ 
<Location /apps/thisone/> 
    SetHandler perl-script 
    PerlResponseHandler ModPerl::Registry 
    PerlOptions +ParseHeaders 
    PerlSetEnv MYLIB /srv/http/site/apps/thisone/lib 
    Options +ExecCGI 
    Order allow,deny 
    Allow from all 
</Location> 

Dans ce dernier cas:

Alias /apps/ /srv/http/site/apps/ 
<Location /apps/thisone/> 
    SetHandler perl-script 
    PerlResponseHandler ModPerl::Registry 
    PerlOptions +ParseHeaders 
    PerlSetEnv THISONE_LIB /srv/http/site/apps/thisone/lib 
    PerlSetEnv THATONE_LIB /srv/http/site/apps/thisone/lib 
    Options +ExecCGI 
    Order allow,deny 
    Allow from all 
</Location> 
+0

Je suppose que vous faites alors quelque chose comme "use lib $ ENV {THISONE_LIB}"? –

+0

@Mathieu Oui, dans ce cas, la réponse de David est meilleure: –

1

Do regarder lib::abs. Il convertit un chemin relatif en un chemin absolu et est probablement idéal pour une utilisation sous mod_perl.

2

Dans votre httpd.conf ajoutez la ligne suivante à proximité du sommet:

PerlRequire /location/of/this/script/startup.pl

Puis, en startup.pl, spécifiez les modules requis, comme ceci:

use lib qw(/location/of/module1 /location/of/module1); 1;

Et Presto!

+0

Cela rend ce répertoire global. applications fonctionnant sur le même serveur httpd, je préfère ne pas mélanger l'inclure ctories. –

Questions connexes