web-dev-qa-db-fra.com

Comment inclure un module Perl dans un répertoire différent?

Comment inclure un module Perl dans un répertoire différent? Il doit s'agir d'un chemin relatif à partir du module qui l'inclut.

J'ai essayé

Push ( @INC,"directory_path/more_path");

également

Push ( @INC,"directory_path\\more_path");
46
ees

EDIT: Mettre la bonne solution en premier, à l'origine de cette question . C'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 existe de nombreuses autres façons de rechercher des bibliothèques par rapport au répertoire actuel . 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 vers le haut de votre script Perl:

use lib '..';

Vous pouvez modifier la variable d'environnement Perl5LIB avant d'exécuter le script:

export Perl5LIB=$Perl5LIB:..

La stratégie Push (@INC) peut également fonctionner, mais elle doit être encapsulée dans BEGIN {} pour s'assurer que le Push est exécuté avant la recherche du module:

BEGIN {Push @INC, '..'}
use yourlib;
68
Andomar

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

use est une directive de temps de compilation. Vous Push avez terminé 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, c'est le plus clair, et donc le mieux pour use lib:

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

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

Modifier

Pour charger du code par rapport à votre script/bibliothèque, j'approuve fortement File :: FindLib

Tu peux dire use File::FindLib 'my/test/libs'; pour rechercher un répertoire de bibliothèque n'importe où au-dessus de votre script dans le chemin.

Disons que votre travail est structuré comme ceci:

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

Dans un script dans ossum-thing/scripts/bin:

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

Recherche les répertoires de votre bibliothèque et les ajoute à votre @INC.

Il est également utile de créer un module contenant toute la configuration d'environnement nécessaire pour exécuter votre suite d'outils et de simplement le charger dans tous les exécutables de votre projet.

use File::FindLib 'lib/MyEnvironment.pm'
14
daotoad

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

#!/usr/bin/Perl
use lib '<relative-path>';
use <your lib>;
10
bedwyr

De perlfaq8:


Comment ajouter le répertoire dans lequel se trouve mon programme au chemin de recherche du module/bibliothèque?

(contribution de brian d foy)

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

use lib $directory;

L'astuce dans cette tâche est de trouver le répertoire. Avant que votre script ne fasse autre chose (comme un chdir), vous pouvez obtenir le répertoire de travail actuel avec le module Cwd, qui vient avec Perl:

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

use lib $directory;

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

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 le place dans $ Bin, que vous pouvez ensuite utiliser pour construire le bon chemin de bibliothèque:

use FindBin qw($Bin);
7
brian d foy

Je vais vous dire comment cela peut être fait dans Eclipse. Mon système de développement - Windows 64bit, Eclipse Luna, plugin Perlipse pour Eclipse, programme d'installation de Strawberry pearl. J'utilise Perl.exe comme interprète.

Eclipse> créer un nouveau projet Perl> projet de clic droit> chemin de génération> configurer le chemin de génération> onglet bibliothèques> ajouter un dossier source externe> aller dans le dossier où tous vos modules Perl sont installés> ok> ok. Terminé !

0
big_space

Je suis surpris que personne ne l'ait mentionné auparavant, mais FindBin :: libs trouvera toujours vos bibliothèques car il recherche dans tous les endroits raisonnables par rapport à l'emplacement de votre script.

#!/usr/bin/Perl
use FindBin::libs;
use <your lib>;
0
Juan A. Navarro