É obrigatório que uma pasta com o nome de um pacote devem estar presentes para a criação de um pacote?

StackOverflow https://stackoverflow.com/questions/468818

  •  19-08-2019
  •  | 
  •  

Pergunta

Estamos factoring o código comum de nosso projeto Perl. Um programa principal deve ser dividido em vários módulos reutilizáveis.

O nome do programa é validate_results.pl que contém um conjunto de comandos de validação. Estamos planejando dividir isso em pequenos módulos para que validate_results.pl deve ser como:

use Common::Validate_Results;
use Common::Validate_Results::CommonCommands;
use Common::Validate_Results::ReturnCodeValidation;
...

De acordo com o meu entendimento eu deveria criar uma pasta comum e sob que Validate_Results.pm deve estar presente. Novamente sob Common, pasta Validate_Results deve ser criado e sob que as pastas CommonCommands e ReturnCodeValidation deve estar presente.

É obrigatório que todas essas pastas devem estar presentes ou podemos ter todos os programas Perl em uma única pasta e logicamente agrupá-los e ainda usar o caminho acima para acessar os módulos (digamos uso common::validate_results parecido).

Foi útil?

Solução

A hierarquia do sistema de arquivos é necessária. A :: B :: C será sempre localizado na A / B / C.pm, em algum lugar @INC.

Se você Have de contornar este problema, leia perldoc -f exigem , procurando especificamente a seção sobre referências sub-rotina em @INC. Sim, você pode fazer o módulo carregador de fazer coisas estranhas se é isso que você realmente quer; mas isso não é o que você quer, confie em mim. Basta ficar com a convenção, como os outros 99.9999999% das aplicações Perl fazer.

Outras dicas

Se você quiser 'uso' seus módulos, então você deve estar de acordo com a estrutura. Se você deseja obter em torno de que você pode 'exigir' seus módulos em vez disso, passar o nome do arquivo para exigir.

Você realmente não deveria fazer isso, no entanto. Se você realmente não quer ter uma estrutura de diretórios, tirá-lo dos nomes dos módulos (embora isso pode levar a problemas no futuro se você já tem um nome módulo que entra em conflito com algo mais genérico do CPAN). Basta adicionar o diretório de scripts para o caminho INC via Find :: Bin e usar os módulos diretamente:

use FindBin;
use lib $FindBin::Bin;

use ValidateResults;
use CommonCommands;
use ReturnCodeValidation;

HTH

Aqui está um exemplo de um módulo e é sub-módulos no mesmo arquivo:

package Foo;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo' );

sub from_foo { print "from_foo\n"; }

package Foo::Bar;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo_bar' );

sub from_foo_bar { print "from_foo_bar\n"; }

1;

Em seu programa, se você usar o módulo Foo (o único com um arquivo .pm):

use Foo;

Você terá acesso ao Foo :: Bar funções, com exceção apenas como nomes canônicos (Foo :: Bar :: from_foo_bar). Você pode importá-los como este:

use Foo;
Foo::Bar->import;

Note que você não pode fazer isso:

use Foo::Bar;

Porque não há nenhum arquivo Foo / Bar.pm .

O nome do pacote em um comando 'utilização' é efetivamente apenas um caminho que termina com um arquivo .pm, assim você não precisa de uma pasta com o nome de cada pacote. No seu exemplo, você precisa de pastas:

Common
Common/Validate_Results

Mas você não precisa de pastas:

Common/Validate_Results/CommonCommands
Common/Validate_Results/ReturnCodeValidation

O nome do pacote real no arquivo .pm não tem que ser o mesmo que o nome no comando 'utilização' que carrega. Mas manter os caminhos consistentes com os nomes dos pacotes é sempre uma boa idéia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top