2010-09-28 9 views
8

J'essaie de savoir quel module de mon application CGI :: Application charge Moose. J'ai essayé de surcharger "require" mais je ne semble pas avoir la syntaxe tout à fait raison. Si quelqu'un pouvait nettoyer le code suivant je l'apprécie:Comment savoir quel module charge Moose?

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

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

Fondamentalement, le problème avec ce script est qu'il ne fait rien charger. Quand CORE :: require (@) est appelé, il ne "fait" rien. J'ai essayé de lui passer directement le nom du script en utilisant $ [0], mais cela a juste abouti à la supercherie du script jusqu'à ce que le délai expire.

REMARQUE: Le script ci-dessus est au début de mon script de démarrage

Répondre

16

Hows sur:!.

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

Ce "fonctionne" parce que les références de sous-programme dans @INC sont appelés et ont passé le coderef et nom de fichier comme arguments Voir require perldoc:

Comme mentionné par phaylon, vous pouvez également utiliser Devel::TraceLoad pour obtenir un résumé de tous les modules chargés pendant que votre demande a couru (et quelle ligne de ce fichier les chargé) avec

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

Excellente réponse! J'aime particulièrement celui-ci, car vous évitez de patcher Moose.pm de quelque façon que ce soit. Au lieu de cela, vous profitez d'une fonctionnalité rarement utilisée, mais très cool de '@ INC '. – daotoad

+1

Si vous mettez cela dans une méthode d'import dans un 'wholoads.pm' et vérifiez le premier argument de la méthode, vous pouvez l'utiliser comme 'perl -Mwholoads = Moose yourscript.pl'. J'envisagerais aussi d'utiliser Carp :: cluck() pour obtenir des stacktraces, car cela couvrirait aussi les modules de chargement paresseux à l'exécution. – phaylon

+1

@phaylon: Bonne idée. Bien que je ne serais pas surpris s'il y avait un module qui a déjà fait tout cela sur CPAN? Sinon, cela ressemble à un nouveau projet! – draegtun

5

Vous pouvez savoir qui est le chargement d'un module particulier, en insérant quelques lignes au début du module pour obtenir le " votre interlocuteur". Trouvez Moose.pm dans votre arbre bibliothèque (perl -mMoose -wle'print $INC{"Moose.pm"}', et le modifier à:.

package Moose; 

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

C'est rapide et sale, mais il semble que cela est tout ce que vous avez besoin (Ne pas oublier de unedit les changements à Moose. h lorsque vous avez terminé)

4

En * Nix:

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

Le concept serait le même dans Windows.

Vous devriez obtenir:

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