/ / Como adicionar dinamicamente o caminho da biblioteca de um programa ao @INC no programa Perl? - perl

Como adicionar dinamicamente o caminho da biblioteca de um programa para @INC no programa Perl? - perl

Estou trabalhando em um aplicativo que está escrito emPerl. O aplicativo é tão grande agora que desejo mover cada classe para um arquivo separado. Esta complicada construção e instalação do programa; quando era apenas um arquivo, podia ser facilmente copiado em qualquer lugar. Agora eu tenho que usar um sistema de compilação como Build::Module ou ExtUtils::MakeMaker.

Eu estruturei minha árvore de origem para ter dois diretórios: bin onde está o iniciador do programa e lib onde estão vários módulos. Bin contém um script Perl executável que o usuário chama e carrega o módulo necessário do diretório lib.

O problema que tenho é que desejo que o usuário possa especificar um prefixo onde deseja que o programa seja instalado, semelhante ao --prefix opção oferecida por pacotes baseados no GNU Autotools. Como esse pode não ser o caminho padrão em que o Perl procura por módulos (por exemplo / opt / program), o usuário verá uma mensagem dizendo algo como Can"t locate Program.pm in @INC.

Existe uma maneira de fazer o programa detectar onde os módulos devem ser carregados e adicionar dinamicamente esse caminho para @INC? Não quero que o usuário trabalhe manualmente com variáveis ​​de ambiente como PERL5LIB para executar o programa.

Respostas:

3 para resposta № 1

Você não pode usar findbin e lib ?:

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

2 para resposta № 2

Se eu entendo você, você está terminando um grandeprograma grande em componentes menores. Bom para você! Essa é uma ótima técnica de programação. Tornar cada classe um verdadeiro módulo Perl é uma ótima idéia. Torna seu programa muito mais fácil de manter.

Eu faço isso o tempo todo. Primeiro, eu uso o nome do módulo Local:: como meu prefixo. O CPAN nunca usará Local como prefixo do módulo, sei que nunca entrarei em conflito com algum módulo CPAN. Então eu coloquei meu Local diretório de módulo no mesmo diretório que meu script. Na maioria das instalações Perl padrão, quando o Perl pesquisa @INC para módulos, o último diretório que ele pesquisa é o diretório atual (.) Como meus nomes de módulo nunca se chocam com nenhum módulo CPAN, eu sei que o Perl encontrará meus módulos e apenas meus módulos sob esse ./Local diretório.

Agora você pode distribuir o diretório inteiroestrutura para outros usuários. Tudo o que um usuário precisa fazer é instalar todo o diretório (que inclui os scripts e módulos) e executar o script. Não há necessidade de passar por um processo de instalação inteiro.


0 para resposta № 3

O código a seguir funciona para mim. Você fornece uma opção de linha de comando como (--prefix abc) e esse valor é anexado ao caminho da lib muito cedo no seu script. Portanto, todos os módulos seguintes serão pesquisados ​​com o caminho definido dinamicamente.

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