2009-05-08 7 views

Répondre

56

EDIT: Mettre la bonne solution d'abord, originaire de this question. Il est le seul qui recherche par rapport au répertoire du module :

use FindBin;     # locate this script 
use lib "$FindBin::Bin/.."; # use the parent directory 
use yourlib; 

Il y a beaucoup d'autres façons qui recherchent des bibliothèques par rapport au répertoire courant . Vous pouvez appeler Perl avec l'argument -I, en passant le répertoire de l'autre module:

perl -I.. yourscript.pl 

Vous pouvez inclure une ligne près du haut de votre script perl:

use lib '..'; 

Vous pouvez modifier l'environnement PERL5LIB variable avant de lancer le script:

export PERL5LIB=$PERL5LIB:.. 

la poussée stratégie (@INC) peut également fonctionner, mais il doit être enveloppé dans begin {} pour vous assurer que la poussée est exécutée avant le module searc h:

BEGIN {push @INC, '..'} 
use yourlib; 
+0

Après de nombreuses tentatives le code qui a finalement fonctionné était de la question que Andomar lié à: utiliser FindBin; # localise ce scriptuse lib "$ FindBin :: Bin/.."; # utiliser le répertoire parent utiliser EPMS; Merci pour votre aide à tous! –

+0

A la vôtre, on dirait que tout le monde lit "répertoire courant" où vous avez écrit "répertoire du module". – Andomar

+0

Après avoir lu http://stackoverflow.com/a/90721/2668831, qui prétend que la méthode FindBin n'est pas robuste pour certaines formes d'organisation Perl modulaire (quelqu'un d'autre peut être en mesure de clarifier) ​​ –

10

'use lib' peut également prendre une seule valeur de chaîne ...

#!/usr/bin/perl 
use lib '<relative-path>'; 
use <your lib>; 
+0

Quel est le chemin relatif par rapport à? – Flimm

12

La raison pour laquelle votre push n'a pas fonctionné est probablement l'ordre d'exécution.

use est une directive de compilation. Vous push se fait au moment de l'exécution:

push (@INC,"directory_path/more_path"); 
use Foo.pm; # In directory path/more_path 

Vous pouvez utiliser un bloc BEGIN pour contourner ce problème:

BEGIN { 
    push (@INC,"directory_path/more_path"); 
} 
use Foo.pm; # In directory path/more_path 

OMI, il est clair, et donc mieux use lib:

use lib "directory_path/more_path"; 
use Foo.pm; # In directory path/more_path 

Voir perlmod pour plus d'informations sur BEGIN et d'autres blocs spéciaux et quand ils s'exécutent.

Modifier

Pour le code de chargement par rapport à votre script/bibliothèque, je souscris fortement File::FindLib

Vous pouvez dire use File::FindLib 'my/test/libs'; pour trouver un répertoire de bibliothèque partout au-dessus de votre script dans le chemin.

que votre travail est structuré comme celui-ci:

/home/me/projects/ 
    |- shared/ 
    | |- bin/ 
    | `- lib/ 
    `- ossum-thing/ 
     `- scripts 
      |- bin/ 
      `- lib/ 

l'intérieur d'un script dans ossum-thing/scripts/bin:

use File::FindLib 'lib/'; 
use File::FindLib 'shared/lib/'; 

trouverez vos répertoires de bibliothèque et les ajouter à votre @INC.

Il est également utile de créer un module qui contient tous les paramètres d'environnement nécessaires pour exécuter votre suite d'outils et de le charger dans tous les exécutables de votre projet.

use File::FindLib 'lib/MyEnvironment.pm' 
7

De perlfaq8:


Comment ajouter le répertoire mon programme pour le module/bibliothèque chemin de recherche?

(contribution de brian d foy)

Si vous connaissez le répertoire déjà, vous pouvez l'ajouter à @INC comme vous le feriez pour tout autre répertoire. Vous pouvez utiliser lib si vous connaissez le répertoire à la compilation:

use lib $directory; 

L'astuce dans cette tâche est de trouver le répertoire. Avant votre script ne fait rien d'autre (comme un chdir), vous pouvez obtenir le répertoire de travail en cours avec le module Cwd, qui est livré avec Perl:

BEGIN { 
    use Cwd; 
    our $directory = cwd; 
    } 

use lib $directory; 

Vous pouvez faire une chose similaire avec la valeur de 0 $, ce qui détient le nom du script. Cela peut contenir un chemin relatif, mais rel2abs peut le transformer en un chemin absolu. Une fois que vous avez le

BEGIN { 
    use File::Spec::Functions qw(rel2abs); 
    use File::Basename qw(dirname); 

    my $path = rel2abs($0); 
    our $directory = dirname($path); 
    } 

use lib $directory; 

Le module FindBin, fourni avec Perl, peut fonctionner. Il trouve le répertoire du script en cours d'exécution et il met en $ Bin, que vous pouvez ensuite utiliser pour construire le chemin de la bibliothèque droite:

use FindBin qw($Bin); 
+0

Votre seconde suggestion (en utilisant 'cwd' dans un bloc' BEGIN') ne semble pas fonctionner. Tout ce que j'obtiens est l'erreur suivante: 'Variable" $ directory "n'est pas importé à ./thingy ligne 16. // Le symbole global" $ directory "nécessite un nom de paquet explicite à la ligne ./thingy 16. // BEGIN non sécurisé après des erreurs - compilation annulée à ./thingy ligne 16. – zrajm

+0

Vous auriez à me montrer votre code. Il semble que vous ayez cité $ directory dans la liste d'importation. –

0

Je suis surpris que personne ne l'a mentionné avant, mais FindBin::libs toujours trouver vos bibliothèques comme elle recherche dans tous les endroits raisonnables par rapport à l'emplacement de votre script.

#!/usr/bin/perl 
use FindBin::libs; 
use <your lib>; 
0

Je vais vous dire comment cela peut être fait en éclipse. Mon système de développement - Windows 64bit, Eclipse Luna, plugin Perlipse pour éclipse, Strawberry pearl installer. J'utilise perl.exe comme interprète. Eclipse> créer un nouveau projet perl> faire un clic droit sur projet> construire un chemin> configurer le chemin de construction> onglet bibliothèques> ajouter un dossier source externe> aller dans le dossier où sont installés tous les modules perl> ok> ok. Terminé !

Questions connexes