我有几个使用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::
)?
答案 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::Install和Dist::Zilla)可能会支持插件为您执行此操作,但基本结果将相同。
请注意,这将为您的发行版生成描述先决条件的META文件。它没有这个逻辑,而是会显示你的模块需要你构建发行版时的结果,规范中没有任何方法可以表达你想要的东西。这不会破坏任何东西,CPAN模块安装程序将运行Makefile.PL并信任它在META文件中所说的内容,只要dynamic_config为真(默认情况下是这样)。但是,您的要求的动态性质不会显示在https://metacpan.org等内容上。