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 № 1Você 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