如何为依赖项伪造perl模块?

如何为依赖项伪造perl模块?,perl,dependencies,perl-module,dbd,Perl,Dependencies,Perl Module,Dbd,我正在使用的外部Perl库有一个依赖项(DBD::mysql),我不会在我的应用程序(DBD::SQLite)中使用它,所以我希望系统只是假装依赖项在那里,即使它是一个“假依赖项” 我可以只创建一个空的DBD::mysql.pm模块来编译吗?或者有更简单的方法来编译吗?所以我认为这里没有什么问题 当你说依赖时,你的意思是外部模块只是试图要求还是使用?如果是这种情况,那么您应该建议开发人员,他不应该明确地这样做,因为这样做违背了使用的目的。数据库驱动程序应根据所选数据库动态选择 假设作者只是use

我正在使用的外部Perl库有一个依赖项(DBD::mysql),我不会在我的应用程序(DBD::SQLite)中使用它,所以我希望系统只是假装依赖项在那里,即使它是一个“假依赖项”


我可以只创建一个空的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()