PAR Packer可以生成独立脚本吗?

时间:2009-09-14 22:16:53

标签: perl par perl-packager

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

2 个答案:

答案 0 :(得分:3)

嗯,你看过documentation了吗?它提供了许多命令行选项来包含依赖项,甚至还包括手动强制包含模块的选项。

答案 1 :(得分:1)

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

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

实际上,如果你看一下sources for Log::Any(由CHI :: Driver :: File使用),你会很快发现它使用动态加载模块。这就是为什么:: Adapter :: Null模块没有被选中的原因。

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