Pergunta

Atualmente estou usando o PAR Packer (pp) para empacotar um par de scripts de pl tais que eles podem ser copiados para uma máquina e "apenas trabalho", sem o meu cliente ter que mexer com CPAN.

Infelizmente, o PAR Packer não funciona para dependências profundas. Por exemplo, um script importações CHI :: Motorista :: arquivo, mas não explicitamente importar Log :: Qualquer :: Adaptador :: nulo que CHI :: Motorista :: File requer. O PAR não pegar essa dependência e executar o script gerado irá falhar com a seguinte mensagem de erro:

Can't locate Log/Any/Adapter/Null.pm in @INC (@INC contains: CODE(0x874aab8) /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc/lib /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc CODE(0x87e8f54) CODE(0x87e9194)) at (eval 215) line 3.
Compilation failed in require at CHI/Driver/File.pm line 11.
BEGIN failed--compilation aborted at CHI/Driver/File.pm line 11.

O meu trabalho-around é importar explicitamente "Log :: Qualquer :: Adaptador :: nulo", mas deve haver uma maneira melhor. Talvez este seja um bug com o PAR Packer? Eu instalei a versão mais recente (0,994).

Foi útil?

Solução

Se você quer um script autônomo em oposição a um binário stand-alone (que é o modo padrão para pp), em seguida, adicione a opção -P. Eu aconselho contra ele, no entanto. É o modo menos testado de operação.

Note também que PAR :: Packer funciona para dependências profundas. O tema da sua pergunta é um pouco pretensioso. Na verdade, PAR :: Packer não realmente verificar todas as dependências si, mas os delegados deste ao Módulo :: ScanDeps. Agora, Module :: ScanDeps é uma abordagem heurística para verificação de dependência e pode ser quebrado por fuzzing feio com carregamento dinâmico de dependências. (isto é, os nomes dos módulos de geração em tempo de execução e, em seguida, utilizando-os num Eval).

Na verdade, se você olhar para o fontes para Log :: Qualquer (que é usado pelo CHI :: motorista :: File), você verá rapidamente que ele usa o carregamento dinâmico de módulos. É por isso que o :: módulo adaptador :: nulo não está a ser apanhada.

Geralmente, nós corrigir esses problemas através da adição de um caso especial para Module :: ScanDeps para tais módulos cujo autor pensei que seria uma boa idéia para derrotar qualquer tipo de análise estática. Até obter uma versão fixa do Module :: ScanDeps , você pode usar o -c ou opções -x para pp ter a compilação uso de resolução de dependência ou execução do programa, em vez de apenas depender de análise estática. Os aumentada Module :: ScanDeps tem versão 0.95 e deve estar disponível a partir de CPAN no mesmo dia.

Outras dicas

Bem, se você ler o documentação ? Ele dá uma série de opções de linha de comando para incluir dependências, e até mesmo a opção de módulos forçar manualmente para ser incluído.

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