/ / ¿Cómo agregar dinámicamente la ruta de la biblioteca de un programa a @INC en el programa Perl? - perl

¿Cómo agregar dinámicamente la ruta de la biblioteca de un programa a @INC en el programa Perl? - Perl

Estoy trabajando en una aplicación que está escrita enPerl. La aplicación es tan grande ahora que quiero mover cada clase a un archivo separado. Esto complicó la construcción e instalación del programa; cuando solo era un archivo, podía copiarse fácilmente en cualquier lugar. Ahora tengo que usar un sistema de compilación como Build::Module o ExtUtils::MakeMaker.

He estructurado mi árbol fuente para que tenga dos directorios: bin donde esta el programa lanzador, y lib donde hay una serie de módulos. Bin contiene un script de Perl ejecutable que el usuario invoca y carga el módulo necesario desde el directorio lib.

El problema que tengo es que quiero que el usuario pueda especificar un prefijo donde quiere que se instale el programa, similar a la --prefix Opción ofrecida por paquetes basados ​​en GNU Autotools. Debido a que esta podría no ser una ruta estándar donde Perl busca módulos (por ejemplo / opt / program), el usuario verá un mensaje que dice algo como Can"t locate Program.pm in @INC.

¿Hay alguna manera de hacer que el programa detecte dónde deben cargarse los módulos y agregue dinámicamente esa ruta a @INC? No quiero que el usuario tenga que trabajar manualmente con variables de entorno como PERL5LIB con el fin de obtener el programa en ejecución.

Respuestas

3 para la respuesta № 1

No podías usar busqueda y lib ?:

use FindBin qw($Bin);
use lib "$Bin/lib";

2 para la respuesta № 2

Si te entiendo, estás rompiendo un granPrograma grande en componentes más pequeños. ¡Bien por usted! Esa es una gran técnica de programación. Hacer de cada clase un verdadero módulo Perl es una gran idea. Hace que su programa sea mucho más fácil de mantener.

Hago esto todo el tiempo. Primero, uso el nombre del módulo. Local:: como mi prefijo. CPAN nunca usará Local como un prefijo de módulo, así que sé que nunca entraré en conflicto con algún Módulo CPAN. Entonces, puse mi Local Directorio del módulo en el mismo directorio que mi script. En la mayoría de las instalaciones estándar de Perl, cuando Perl busca @INC para los módulos, el último directorio que busca es el directorio actual (.). Dado que los nombres de mis módulos nunca coincidirán con ningún módulo CPAN, sé que Perl encontrará mis módulos y solo mis módulos debajo de eso ./Local directorio.

Ahora puedes distribuir todo el directorio.Estructura a otros usuarios. Todo lo que un usuario debe hacer es instalar todo el directorio (que incluye los scripts y los módulos) y ejecutar el script. No es necesario pasar por un proceso de instalación completo.


0 para la respuesta № 3

El siguiente código funciona para mí. Suministra una opción de línea de comando como (--prefix abc) y ese valor se agrega a la ruta lib muy temprano en su script. Por lo tanto, todos los módulos siguientes se buscarán con la ruta configurada dinámicamente.

use strict;
use warnings;
use Getopt::Long;

my $prefix = "";

BEGIN {
GetOptions ("prefix=s" => $prefix );
$prefix = $prefix || ".";
}

use lib "$prefix";
use mymod; # uses the dynamical search path