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

Jef*_*ler 8 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 (@_);
  };
}
Run Code Online (Sandbox Code Playgroud)

基本上,这个脚本的问题是它实际上并没有加载任何东西.当CORE :: require(@ )被调用时,它不会"做"任何事情.我尝试直接使用$ [0] 传递脚本名称,但这只会导致脚本死锁,直到它超时.

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

dra*_*tun 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';
  };
}
Run Code Online (Sandbox Code Playgroud)

这"工作",因为调用子例程引用@INC并将coderef和filename作为参数传递.见requireperldoc:

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

perl -MDevel::TraceLoad=summary my_progam.pl
Run Code Online (Sandbox Code Playgroud)

  • @draegtun:经过一些搜索,有Devel-TraceLoad,看起来非常合适.它不会查找特定的包,但会给出摘要. (4认同)
  • 很好的答案!我特别喜欢这个,因为你避免以任何方式修补Moose.pm.相反,你利用了`@ INC`中很少使用但非常酷的功能. (2认同)

Eth*_*her 5

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

package Moose;

use Data::Dumper;
warn "!!! Moose is being loaded by: ", Dumper([caller]);
Run Code Online (Sandbox Code Playgroud)

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