【问题标题】:Can PAR Packer generate stand-alone scripts?PAR Packer 可以生成独立的脚本吗?
【发布时间】:2009-09-14 22:16:52
【问题描述】:

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

【问题讨论】:

  • 描述你使用哪些命令行选项来构建包。
  • 我正在使用脚本将每个 pl 文件单独编译成 cgi。我使用以下命令行参数:-I -X 和 -o

标签: perl par perl-packager


【解决方案1】:

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

【讨论】:

  • 谢谢布拉德。我确实阅读了文档,但文档中没有任何地方 PAR Packer 指定需要任何特定标志才能生成独立脚本。事实上,文档明确指出:“pp 使用 PAR 提供的压缩打包器和 Module::ScanDeps 提供的依赖检测启发式从 Perl 程序创建独立的可执行文件。源文件是逐字压缩的,无需编译。”这正是我正在寻找的,但不幸的是它不起作用。有什么想法吗?
【解决方案2】:

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

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

确实,如果您查看sources for Log::Any(由 CHI::Driver::File 使用),您会很快看到它使用模块的动态加载。这就是 ::Adapter::Null 模块没有被拾取的原因。

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

【讨论】:

  • Module::ScanDeps 0.95 已抵达 CPAN。参照。 search.cpan.org/dist/Module-ScanDeps
  • 我还想指出, pp -c 必须与正在打包的脚本在同一目录中执行,否则您最终会得到一个不正确的@INC(假设您包含自己的 perl 模块存在于另一个目录中并且使用 BEGIN 块来推送 @INC 或“use lib”模块)。在尝试使用 pp -c 打包脚本时,这给我带来了无穷无尽的麻烦。
猜你喜欢
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多