如何为依赖项伪造perl模块?
我正在使用的外部Perl库有一个依赖项(DBD::mysql),我不会在我的应用程序(DBD::SQLite)中使用它,所以我希望系统只是假装依赖项在那里,即使它是一个“假依赖项”如何为依赖项伪造perl模块?,perl,dependencies,perl-module,dbd,Perl,Dependencies,Perl Module,Dbd,我正在使用的外部Perl库有一个依赖项(DBD::mysql),我不会在我的应用程序(DBD::SQLite)中使用它,所以我希望系统只是假装依赖项在那里,即使它是一个“假依赖项” 我可以只创建一个空的DBD::mysql.pm模块来编译吗?或者有更简单的方法来编译吗?所以我认为这里没有什么问题 当你说依赖时,你的意思是外部模块只是试图要求还是使用?如果是这种情况,那么您应该建议开发人员,他不应该明确地这样做,因为这样做违背了使用的目的。数据库驱动程序应根据所选数据库动态选择 假设作者只是use
我可以只创建一个空的DBD::mysql.pm模块来编译吗?或者有更简单的方法来编译吗?所以我认为这里没有什么问题 当你说依赖时,你的意思是外部模块只是试图
要求还是使用?如果是这种情况,那么您应该建议开发人员,他不应该明确地这样做,因为这样做违背了使用的目的。数据库驱动程序应根据所选数据库动态选择
假设作者只是use
ing包名,因为他认为这是一件有用或有意义的事情,那么是的,您可以覆盖该包,有几种方法可以做到这一点
正如您所建议的,您只需创建自己的模块DBD/mysql.pm
,该模块将定义DBD::mysql
包
如果你感兴趣的话,你还可以做一些其他的事情。您不需要在源代码树中乱扔伪造的目录和文件,只需要让Perl相信模块已经加载。我们可以通过直接操作%INC
来实现这一点
package main; # or whereever
BEGIN {
$INC{'DBD/mysql.pm'} = "nothing to see here";
}
只需添加这个散列键,就可以避免在文件系统中搜索有问题的模块。注意这是在开始
块中。如果外部作者执行了use
操作,则必须在计算use
语句之前填充此值。这些语句相当于包装在BEGIN
中的require
和import
现在,让我们进一步推测,在一般意义上,外部作者试图调用包的方法。如果这些符号不存在,则会出现运行时错误。您可以利用Perl的自动加载
,拦截此类调用并执行正确的操作。正确的做法可能有很多不同,从简单地记录消息到更详细的内容。例如,您可以使用此工具检查作者通过监视所有调用引入的耦合深度
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()
现在,我们还将讨论一个案例,其中有问题的作者还创建了一些面向对象的类实例,而他的代码没有正确地解释
为您的存根代码。我们将存根我们假定为new
的构造函数,以便用我们的包名祝福匿名哈希。那样的话,你就不会
在实例上调用方法时出错
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()