Как выяснить, какой модуль загружает Moose? - PullRequest
8 голосов
/ 28 сентября 2010

Я пытаюсь выяснить, какой модуль в моем 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 ]

16 голосов
/ 28 сентября 2010

Как насчет:

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
5 голосов
/ 28 сентября 2010

Вы можете узнать, кто загружает конкретный модуль, вставив несколько строк в начале модуля, чтобы получить «вызывающего». Найдите Moose.pm в дереве вашей библиотеки (perl -mMoose -wle'print $INC{"Moose.pm"}' и измените его на:

package Moose;

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

Это быстро и грязно, но, похоже, это все, что тебе нужно. (Не забудьте отменить изменения в Moose.pm, когда закончите!)

4 голосов
/ 28 сентября 2010

В * 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 ...
...