【问题标题】:What can make Class::Loader fail where "use" and "new" do not?什么可以使 Class::Loader 在“use”和“new”没有失败的情况下失败?
【发布时间】:2010-10-01 09:43:42
【问题描述】:

我正在开发一个使用 Crypt::RSA 的大型 CGI 应用程序,该应用程序已正确安装。当我尝试运行任何嵌入式库时,我收到“尝试将空引用作为函数调用”类型的错误(我现在无法返回确切的错误,因为我们必须回滚发布日期) .我跟踪对 Crypt::RSA 构造函数的空引用,该构造函数使用 Class::Loader 来启用 Crypt::RSA::ES::OAEP。

我用“use”和“new”替换了类加载器,这部分工作正常,尽管库在很多方面仍然失败。显然我的环境有问题。我只是不确定是什么。谁能给我一些线索?

【问题讨论】:

  • 您是否尝试过运行 Crypt::RSA 的测试?
  • 是的,他们都成功了。
  • 开发环境和服务器环境都出现这个错误吗?
  • 不,只是暂存。在这一点上,我已经为自己解决了这个问题,尽管不是它的根本原因。我即将发布我如何解决它以供将来参考。如果有人发现它背后的全部事实,我不介意。

标签: perl cgi cpan


【解决方案1】:

好的,经过 12 个小时的深入研究,我得到了这个工作。

这就是发生的事情(但不是原因)。每当我在引用的userequire 语句中调用eval() 时(如发生在Class::Loader 中,但也发生在Crypt:: 框架中的其他位置),它看不到以其他方式包含为Perl 的路径类路径。由于大多数引用的 use/require 对象只是假设该类将在那里,因此很少有有用的错误被抛出。我会将@INC 转储到文件中,在 eval 块之外,一切都会在那里。

具有讽刺意味的是,我在 dev 与 staging 中使用了相同的设置,它在 dev 中有效,但在 staging 中无效。我还必须指出,FindBin(我不应该在 CGI 中使用它,我知道,但 Crypt 使用它)在 /dev/null 暂存中上下波动,但在开发中没有。

由于我无法轻松比较版本或全局配置,因此我的任务就此结束。

我在 Crypt::RSA 中为自己解决问题的方法是禁用与 FindBin 相关的所有命令,并为我的代码可以访问的任何内容硬编码 require 引用。我在 Crypt::RSA 中为 Crypt::RSA::ES::OAEP 做了一个要求,在 Crypt::Random::Generator 中为 Crypt::Random::Provider::rand 做了一个要求

希望这对以后遇到问题的人有所帮助。任何可以提出原因的人,请回复,我会添加它以完成帖子。

【讨论】:

  • 是否有一个特定的 eval{} 使用/要求在其中?你能用 Data::Dumper 在 eval{} 内外射出 \@INC 吗?
  • 我目前没有完整的源代码访问权限,因为它正在工作中,为此我正在将我的项目插入到同事那里。我会建立一个手工制作的例子,但我可能无法复制这些条件。但特别是,我抓住了它: eval("require $module");在 Class::Loader 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多