1

我目前正在使用 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)。

4

2 回答 2

3

好吧,你读过文档吗?它提供了许多命令行选项来包含依赖项,甚至可以手动强制包含模块。

于 2009-09-15T03:32:15.127 回答
1

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

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

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

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

于 2009-09-16T09:08:50.617 回答