metacpan - ¿Cómo incluyo un módulo Perl que está en un directorio diferente?
perl package manager (6)
''use lib'' también puede tomar un único valor de cadena ...
#!/usr/bin/perl
use lib ''<relative-path>'';
use <your lib>;
¿Cómo incluyo un módulo Perl que está en un directorio diferente? Debe ser una ruta relativa del módulo que la está incluyendo.
He intentado
push ( @INC,"directory_path/more_path");
además
push ( @INC,"directory_path//more_path");
Desde perlfaq8:
¿Cómo agrego el directorio en el que reside mi programa a la ruta de búsqueda del módulo / biblioteca?
(contribuido por brian d foy)
Si ya conoce el directorio, puede agregarlo a @INC como lo haría con cualquier otro directorio. Puede usar lib si conoce el directorio en tiempo de compilación:
use lib $directory;
El truco en esta tarea es encontrar el directorio. Antes de que su script haga algo más (como un chdir), puede obtener el directorio de trabajo actual con el módulo Cwd, que viene con Perl:
BEGIN {
use Cwd;
our $directory = cwd;
}
use lib $directory;
Puede hacer algo similar con el valor de $ 0, que contiene el nombre del script. Eso podría contener una ruta relativa, pero rel2abs puede convertirlo en una ruta absoluta. Una vez que tienes el
BEGIN {
use File::Spec::Functions qw(rel2abs);
use File::Basename qw(dirname);
my $path = rel2abs( $0 );
our $directory = dirname( $path );
}
use lib $directory;
El módulo FindBin, que viene con Perl, podría funcionar. Encuentra el directorio del script actualmente en ejecución y lo coloca en $ Bin, que luego puede usar para construir la ruta correcta de la biblioteca:
use FindBin qw($Bin);
EDITAR: Poner la solución correcta primero, originalmente a partir de esta pregunta . Es el único que busca en relación con el directorio del módulo :
use FindBin; # locate this script
use lib "$FindBin::Bin/.."; # use the parent directory
use yourlib;
Hay muchas otras formas de buscar bibliotecas en relación con el directorio actual . Puede invocar perl con el argumento -I, pasando el directorio del otro módulo:
perl -I.. yourscript.pl
Puede incluir una línea cerca de la parte superior de su script de Perl:
use lib ''..'';
Puede modificar la variable de entorno PERL5LIB antes de ejecutar el script:
export PERL5LIB=$PERL5LIB:..
La estrategia de inserción (@INC) también puede funcionar, pero debe completarse en BEGIN {} para asegurarse de que la inserción se ejecute antes de la búsqueda del módulo:
BEGIN {push @INC, ''..''}
use yourlib;
Lo más probable es que el motivo por el que su impulso no funcionó sea el orden de ejecución.
use
es una directiva de tiempo de compilación. Tu push
está hecho en el momento de la ejecución:
push ( @INC,"directory_path/more_path");
use Foo.pm; # In directory path/more_path
Puede usar un bloque BEGIN para evitar este problema:
BEGIN {
push ( @INC,"directory_path/more_path");
}
use Foo.pm; # In directory path/more_path
IMO, es más claro, y por lo tanto es mejor use lib
:
use lib "directory_path/more_path";
use Foo.pm; # In directory path/more_path
Ver perlmod para información sobre BEGIN y otros bloques especiales y cuándo se ejecutan.
Editar
Para cargar el código relativo a su secuencia de comandos / biblioteca, respaldo firmemente File::FindLib
Puedes decir use File::FindLib ''my/test/libs'';
buscar un directorio de biblioteca en cualquier lugar encima del script en la ruta.
Digamos que tu trabajo está estructurado así:
/home/me/projects/
|- shared/
| |- bin/
| `- lib/
`- ossum-thing/
`- scripts
|- bin/
`- lib/
Dentro de una secuencia de comandos en ossum-thing/scripts/bin
:
use File::FindLib ''lib/'';
use File::FindLib ''shared/lib/'';
Encontrará los directorios de su biblioteca y los agregará a su @INC
.
También es útil crear un módulo que contenga toda la configuración del entorno necesaria para ejecutar su conjunto de herramientas y simplemente cargarlo en todos los ejecutables de su proyecto.
use File::FindLib ''lib/MyEnvironment.pm''
Me sorprende que nadie lo haya mencionado antes, pero FindBin::libs siempre encontrará sus libs mientras busca en todos los lugares razonables relativos a la ubicación de su script.
#!/usr/bin/perl
use FindBin::libs;
use <your lib>;
Te diré cómo se puede hacer en eclipse. Mi sistema de desarrollo - Windows 64bit, Eclipse Luna, plugin Perlipse para eclipse, instalador Strawberry pearl. Yo uso perl.exe como mi intérprete.
Eclipse> crear nuevo proyecto perl> clic derecho proyecto> ruta de compilación> configurar compilación> pestaña bibliotecas> agregar carpeta de origen externa> ir a la carpeta donde están instalados todos sus módulos perl> ok> ok. Hecho !