Can PAR Packer gerar scripts stand-alone?
-
07-07-2019 - |
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).
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.