我目前正在使用PAR Packer(pp)打包几个pl脚本,以便将它们复制到一台机器上并“正常工作”。没有我的客户不得不使用CPAN。

不幸的是,PAR Packer不适用于深度依赖。例如,脚本导入CHI :: Driver :: File但不显式导入CHI :: Driver :: File需要的Log :: Any :: Adapter :: Null。 PAR不会获取此依赖项,并且运行生成的脚本将崩溃,并显示以下错误消息:

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.

我的解决方法是显式导入“Log :: Any :: Adapter :: Null”。但必须有一个更好的方法。也许这是PAR Packer的一个错误?我安装了最新版本(0.994)。

有帮助吗?

解决方案

如果您需要独立脚本而不是独立二进制文件(这是pp的默认模式),请添加-P选项。不过,我建议不要这样做。这是经过最少测试的操作模式。

另请注意,PAR :: Packer适用于深度依赖。你的问题的主题有点自命不凡。事实上,PAR :: Packer本身并没有真正检查任何依赖项,而是将其委托给Module :: ScanDeps。现在,Module :: ScanDeps是依赖扫描的一种启发式方法,它可以通过动态加载依赖项的丑陋模糊来打破。 (即在运行时生成模块名称,然后在eval中使用它们。)

的确,如果你看一下 Log :: Any 的源代码(由CHI :: Driver :: File使用),您很快就会看到它使用动态加载模块。这就是为什么:: Adapter :: Null模块没有被选中的原因。

通常,我们通过向Module :: ScanDeps添加一个特殊情况来解决这些问题,这些模块的作者认为打败任何类型的静态分析都是个好主意。在获得 Module :: ScanDeps 的固定版本之前,您可以使用-c或-x选项使pp具有依赖性解析使用程序的编译或执行,而不是仅依赖于静态分析。增强的Module :: ScanDeps版本为0.95,应该可以在一天内从CPAN获得。

其他提示

那么,您是否阅读了文档?它提供了许多命令行选项来包含依赖项,甚至还包括手动强制包含模块的选项。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top