2010-09-28 12 views
8

Sto cercando di capire quale modulo nel mio CGI :: Application sta caricando Moose. Ho tentato di sovraccaricare "require" ma non ho la sintassi corretta. Se qualcuno potesse ripulire il codice seguente sarei grato:Come faccio a capire quale modulo sta caricando Moose?

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

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

In sostanza, il problema con questo script è che non è effettivamente caricando nulla. Quando CORE :: require (@) viene chiamato non "fa" nulla. Ho provato a passare il nome dello script direttamente usando $ [0], ma questo ha provocato lo stallo dello script fino al suo timeout.

NOTA: Lo script precedente è all'inizio del mio avvio di script

risposta

16

Hows su:!.

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'; 
    }; 
} 

Questa "opere", perché i riferimenti a subroutine @INC sono chiamati e superato il rifcodice e il nome come argomenti Vedi require perldoc:

0.123.

Come menzionato da phaylon, è anche possibile utilizzare Devel::TraceLoad per ottenere una sintesi di tutti i moduli caricati mentre l'applicazione ha funzionato (e quale linea di quale file loro carico) con

perl -MDevel::TraceLoad=summary my_progam.pl 
+2

Ottima risposta! Mi piace particolarmente perché eviti di applicare patch a Moose.pm in qualsiasi modo. Invece si approfitta di una caratteristica raramente usata, ma molto interessante di '@ INC'. – daotoad

+1

Se lo si inserisce in un metodo di importazione in un "wholoads.pm" e si verifica il primo argomento rispetto al metodo, è possibile utilizzarlo come "perl -Mwholoads = Moose yourscript.pl". Prenderò inoltre in considerazione l'utilizzo di Carp :: cluck() per ottenere stacktraces, poiché ciò riguarderebbe anche i moduli lazy-loading in fase di esecuzione. – phaylon

+1

@phaylon: ottima idea. Anche se non sarei sorpreso se ci fosse un modulo che ha già fatto tutto questo su CPAN? Se non sembra un nuovo progetto! – draegtun

5

Si può scoprire chi è il caricamento di un particolare modulo, inserendo poche righe all'inizio del modulo per ottenere il " chiamante". Trova Moose.pm nel tuo albero libreria (perl -mMoose -wle'print $INC{"Moose.pm"}', e modificarlo per:.

package Moose; 

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

Questo è veloce e sporco, ma suona come se fosse tutto ciò che serve (non dimenticare di unedit le modifiche a Moose. pm quando si è fatto)

4

in * nix:

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

Il concetto sarebbe lo stesso in Windows.

Si dovrebbe ottenere:

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