我如何找出装载Moose的模块?

时间:2010-09-28 17:26:55

标签: perl moose dbix-class

我想弄清楚我的CGI :: Application中的哪个模块正在加载Moose。我试图超载“require”但我似乎没有正确的语法。如果有人可以清理以下代码,我将不胜感激:

use strict;
use warnings;
use Carp qw//;

BEGIN {
  *CORE::GLOBAL::require = sub (*) { 
    warn "Requiring $_[0] at: " . Carp::longmess();
    CORE::require (@_);
  };
}

基本上,这个脚本的问题是它实际上并没有加载任何东西。调用CORE :: require(@ )时,不会“执行”任何操作。我尝试直接使用$ [0]将脚本名称传递给它,但这只会导致脚本死锁,直到它超时。

注意:以上脚本位于我启动脚本的开头

3 个答案:

答案 0 :(得分:16)

如何:

BEGIN {
  unshift @INC, sub {
    printf "Moose first called by pkg %s at line %d in %s\n", (caller)[0,2,1]
      if $_[1] eq 'Moose.pm';
  };
}

这“有效”,因为调用@INC中的子例程引用并将coderef和filename作为参数传递。见require perldoc:

phaylon所述,您还可以使用Devel::TraceLoad获取应用程序运行时加载的所有模块的摘要(以及加载它们的文件的哪一行)

perl -MDevel::TraceLoad=summary my_progam.pl

答案 1 :(得分:5)

通过在模块的开头插入几行来获取“调用者”,您可以找到加载特定模块的人员。在库树(perl -mMoose -wle'print $INC{"Moose.pm"}')中找到Moose.pm,然后将其编辑为:

package Moose;

use Data::Dumper;
warn "!!! Moose is being loaded by: ", Dumper([caller]);

这很快又脏,但听起来就像你需要的一切。 (完成后别忘了对Moose.pm的修改!)

答案 2 :(得分:4)

在* Nix:

mkdir dummy
echo > dummy/Moose.pm
perl -I./dummy /path/to/my_script.pl

这个概念在Windows中是相同的。

你应该得到:

Moose.pm did not return a true value at ...