2009-05-08 7 views

Respuesta

56

EDIT: Poner la solución correcta primero, originalmente desde this question. Es el único que busca en relación con el directorio módulo:

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

Hay muchas otras maneras que buscan las 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 en la parte superior de su script Perl:

use lib '..'; 

puede modificar el entorno PERL5LIB variable antes de ejecutar el script:

export PERL5LIB=$PERL5LIB:.. 

la estrategia de empuje (@INC) también puede funcionar, pero tiene que ser envuelto en BEGIN {} para asegurarse de que el empuje se ejecuta antes de que el módulo de searc h:

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

Después de muchos intentos, el código que finalmente funcionó fue la pregunta a la que Andomar se vinculó: use FindBin; # ubicar este scriptuse lib "$ FindBin :: Bin/.."; # use el directorio principal use EPMS; ¡Gracias por toda su ayuda a todos! –

+0

Saludos, parece que todos leen "directorio actual" donde escribió "directorio del módulo". – Andomar

+0

Se encontró con esto después de leer http://stackoverflow.com/a/90721/2668831, que afirma que el método FindBin no es sólido para algunas formas de organización modular de Perl (alguien más puede ser capaz de aclarar) –

10

'usar lib' también puede tener un único valor de cadena ...

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

¿Cuál es la ruta relativa relativa a? – Flimm

12

Probablemente el orden de ejecución no sea el motivo por el que no funcionó.

use es una directiva de tiempo de compilación. Usted push se realiza en tiempo de ejecución:

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

se puede utilizar un bloque de comenzar a solucionar este problema:

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

OMI, es más claro, y por lo tanto la mejor manera de use lib:

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

Consulte perlmod para obtener información sobre BEGIN y otros bloques especiales y cuándo se ejecutan.

Editar

Para el código de carga con respecto a la secuencia de comandos/biblioteca, apoyo firmemente File::FindLib

Se puede decir use File::FindLib 'my/test/libs'; para buscar un directorio de la biblioteca en cualquier lugar por encima de la secuencia de comandos en el camino.

Digamos que su trabajo se estructura como esta:

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

dentro de un script en ossum-thing/scripts/bin:

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

encontrará los directorios de biblioteca y añadirlos a su @INC.

También es útil crear un módulo que contenga toda la configuración de entorno necesaria para ejecutar su conjunto de herramientas y simplemente cargarlo en todos los ejecutables de su proyecto.

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

De perlfaq8:


¿Cómo puedo añadir el directorio de mi programa vive en la ruta de búsqueda de módulo de E/biblioteca?

(aportado por Brian D Foy)

Si conoce el directorio ya, puede agregarlo a @INC como lo haría con cualquier otro directorio. Es posible utilizar lib si se conoce el directorio en tiempo de compilación:

use lib $directory; 

El truco en esta tarea es encontrar el directorio. Antes de que el script hace cualquier otra cosa (como un chdir), se puede obtener el directorio actual de trabajo con el módulo Cwd, que viene con Perl:

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

use lib $directory; 

Usted puede hacer una cosa similar con el valor de $ 0, lo cual contiene el nombre del script. Eso podría contener una ruta relativa, pero rel2abs puede convertirlo en una ruta absoluta. Una vez que tenga 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. Se encuentra en el directorio del script en ejecución y lo pone en $ Bin, que luego se puede utilizar para construir la ruta de la biblioteca derecha:

use FindBin qw($Bin); 
+0

Su segunda sugerencia (usando 'cwd' dentro de un bloque' BEGIN') no parece funcionar. Todo lo que obtengo es el siguiente error: 'Variable" $ directorio "no se importa en ./thingy línea 16. // Símbolo global" $ directorio "requiere nombre explícito del paquete en ./thingy línea 16. // BEGIN no seguro después de errores - compilación abortada en ./thingy línea 16.' – zrajm

+0

Tendría que mostrarme su código. Parece que podría haber cotizado $ directory en la lista de importación. –

0

Me sorprende que nadie ha mencionado antes, pero siempre encontrará FindBin::libs 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>; 
0

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 fuente externa> ir a la carpeta donde están instalados todos sus módulos perl> ok> ok. Hecho !

Cuestiones relacionadas