2011-06-29 3 views
3

Une bibliothèque Perl externe que j'utilise a une dépendance (DBD :: mysql) que je n'utiliserai pas dans mon application (DBD :: SQLite), donc je voudrais que le système prétende simplement que la dépendance est là, même si c'est un "faux". Puis-je simplement créer un module DBD :: mysql.pm vide qui compile ou existe-t-il un moyen plus simple de le faire?comment simuler un module perl pour une dépendance?

Répondre

8

Donc, je pense qu'il y a quelques problèmes ici.

Lorsque vous parlez de dépendance, voulez-vous dire que le module externe essaie simplement de require ou de useDBD::mysql? Si tel est le cas, vous devriez aviser le développeur qu'il ne devrait pas le faire explicitement parce que cela va à l'encontre du but de DBI. Le pilote de base de données doit être sélectionné à la volée basé sur le DSN.

Si l'on suppose que l'auteur est simplement use ing le nom du paquet parce qu'il pensait que c'était une chose utile ou utile à faire, puis oui, vous pouvez remplacer ce paquet, et il y a quelques façons de le faire.

Comme vous l'avez suggéré, vous pouvez simplement créer votre propre module DBD/mysql.pm qui définirait le package DBD::mysql.

Il y a d'autres choses que vous pourriez faire si vous êtes intéressé. Au lieu de joncher votre arborescence source de faux répertoires et fichiers, vous devez simplement convaincre Perl que le module a été chargé. Nous pouvons le faire en manipulant directement %INC. Simplement en ajoutant cette clé de hachage, nous empêchons la recherche du système de fichiers pour le module incriminé. Observez que c'est dans un bloc. Si l'auteur externe a fait un use, nous devons remplir cette valeur avant que l'instruction use ne soit évaluée. Les instructions use sont équivalentes à require et import enveloppées dans un BEGIN.

Maintenant spécule plus loin dans le sens général que l'auteur externe essayait d'appeler des méthodes du paquet. Vous obtiendrez des erreurs d'exécution si ces symboles n'existent pas. Vous pouvez profiter des AUTOLOAD de Perl pour intercepter de tels appels et faire le bon choix. Qu'est-ce La bonne chose peut varier beaucoup, de la simple connexion d'un message à quelque chose de plus élaboré. Par exemple, vous pouvez utiliser cette fonction pour examiner la profondeur du couplage que l'auteur a introduit en surveillant tous les appels.

package DBD::mysql; 

sub AUTOLOAD { 
    printf(
     "I don't wanna '%s' called from '%s'\n", $AUTOLOAD, caller(0) 
    ); 
} 

package main; # or whereever 

BEGIN { 
    $INC{'DBD/mysql.pm'} = "nothing to see here"; 
} 

DBD::mysql::blah() 

Maintenant, nous allons couvrir également le cas où l'auteur incriminé a également créé certains cas orientés objet d'une classe, et son code ne compte pas correctement pour votre code stub. Nous reprendrons le constructeur que nous supposons être new pour bénir un hash anonyme avec notre nom de paquet. De cette façon, vous n'obtiendrez pas d'erreurs lorsqu'il appelle des méthodes sur une instance.

package DBD::mysql; 

sub AUTOLOAD { 
    printf(
     "I don't wanna '%s' called from '%s'\n", $AUTOLOAD, caller(0) 
    ); 
} 

sub new { 
    bless({}, __PACKAGE__) 
} 

package main; # or whereever 

BEGIN { 
    $INC{'DBD/mysql.pm'} = "nothing to see here"; 
} 

my $thing = new DBD::mysql; 

$thing->blah() 
Questions connexes