Pregunta

Actualmente estoy usando PAR Packer (pp) para empaquetar un par de scripts pl de modo que se puedan copiar en una máquina y "simplemente funcionen". sin que mi cliente tenga que meterse con CPAN.

Desafortunadamente, PAR Packer no funciona para dependencias profundas. Por ejemplo, un script importa CHI :: Driver :: File pero no importa explícitamente Log :: Any :: Adapter :: Null que CHI :: Driver :: File requiere. PAR no detecta esta dependencia y la ejecución del script generado se bloqueará con el siguiente mensaje de error:

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.

Mi solución alternativa es importar explícitamente "Log :: Any :: Adapter :: Null" Pero debe haber una mejor manera. Tal vez esto es un error con el Packer PAR? He instalado la última versión (0.994).

¿Fue útil?

Solución

Si desea un script independiente en lugar de un binario independiente (que es el modo predeterminado para pp), agregue la opción -P. Sin embargo, aconsejaría no hacerlo. Es el modo de operación menos probado.

Tenga en cuenta también que PAR :: Packer sí funciona para dependencias profundas. El tema de su pregunta es un poco pretencioso. De hecho, PAR :: Packer realmente no verifica ninguna dependencia en sí misma, pero delega esto a Module :: ScanDeps. Ahora, Module :: ScanDeps es un enfoque heurístico para el escaneo de dependencias y se puede romper con una carga fea con carga dinámica de dependencias. (es decir, generar nombres de módulos en tiempo de ejecución y luego usarlos en una evaluación).

De hecho, si nos fijamos en el fuentes para Log :: Any (que es utilizado por CHI :: Driver :: File), verá rápidamente que utiliza la carga dinámica de módulos. Es por eso que el módulo :: Adaptador :: Nulo no se está recogiendo.

Generalmente, solucionamos estos problemas agregando un caso especial a Module :: ScanDeps para dichos módulos cuyo autor pensó que sería una buena idea derrotar cualquier tipo de análisis estático. Hasta que obtenga una versión fija de Module :: ScanDeps , puede usar -c o las opciones -x a pp para que la resolución de dependencia use la compilación o ejecución del programa en lugar de depender únicamente del análisis estático. El Módulo aumentado :: ScanDeps tiene la versión 0.95 y debería estar disponible en CPAN dentro del día.

Otros consejos

Bueno, ¿ha leído la documentación ? Ofrece una serie de opciones de línea de comandos para incluir dependencias, e incluso la opción de forzar manualmente la inclusión de módulos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top