Perl:回退到较旧的模块

时间:2015-03-09 09:13:55

标签: perl module

我有几个使用Nagios::Plugin的Nagios插件。该模块现已弃用,并由Monitoring::Plugin替换。

由于几个发行版尚未更新,我在代码中检查哪个模块可用

sub load_module {

    my @names = @_;
    my $loaded_module;

    for my $name (@names) {

        my $file = $name;

        # requires need either a bare word or a file name
        $file =~ s{::}{/}gsxm;
        $file .= '.pm';

        eval {
            require $file;
            $name->import();
        };
        if ( !$EVAL_ERROR ) {
            $loaded_module = $name;
            last;
        }
    }

    if ( !$loaded_module ) {
        # handle error ...
        exit 2;
    }

    return $loaded_module;

}

my $plugin_module = load_module( 'Monitoring::Plugin', 'Nagios::Plugin' );
my $plugin_threshold_module = load_module( 'Monitoring::Plugin::Threshold', 'Nagios::Plugin::Threshold' );

我曾经使用

检查Makefile.PL文件中的模块可用性
requires 'Nagios::Plugin'            => 0;
requires 'Nagios::Plugin::Threshold' => 0;

并在我的插件中使用该模块。

Makefile.PL中是否有标准方法来检查模块(即Monitoring::Plugins),如果不可用则检查是否有其他选项(即Nagios::Plugin::)?

1 个答案:

答案 0 :(得分:1)

Makefile.PL只是一个程序,你可以在运行时做同样的检查。

my %prereqs = (
    ...declare your static prereqs...
);

if( eval { require Monitoring::Plugin } ) {
    $prereqs{'Monitoring::Plugin'};
}
else {
    $prereqs{'Nagios::Plugin'};
}

WriteMakefile(
    ...blah blah blah...

    PREREQ_PM => \%prereqs
);

其他模块构建系统(如Module::InstallDist::Zilla)可能会支持插件为您执行此操作,但基本结果将相同。

请注意,这将为您的发行版生成描述先决条件的META文件。它没有这个逻辑,而是会显示你的模块需要你构建发行版时的结果,规范中没有任何方法可以表达你想要的东西。这不会破坏任何东西,CPAN模块安装程序将运行Makefile.PL并信任它在META文件中所说的内容,只要dynamic_config为真(默认情况下是这样)。但是,您的要求的动态性质不会显示在https://metacpan.org等内容上。