内容

名称

Module::Load::Conditional - 在运行时查找模块信息/加载

概要

use Module::Load::Conditional qw[can_load check_install requires];


my $use_list = {
        CPANPLUS        => 0.05,
        LWP             => 5.60,
        'Test::More'    => undef,
};

print can_load( modules => $use_list )
        ? 'all modules loaded successfully'
        : 'failed to load required modules';


my $rv = check_install( module => 'LWP', version => 5.60 )
            or print 'LWP is not installed!';

print 'LWP up to date' if $rv->{uptodate};
print "LWP version is $rv->{version}\n";
print "LWP is installed as file $rv->{file}\n";


print "LWP requires the following modules to be installed:\n";
print join "\n", requires('LWP');

### allow M::L::C to peek in your %INC rather than just
### scanning @INC
$Module::Load::Conditional::CHECK_INC_HASH = 1;

### reset the 'can_load' cache
undef $Module::Load::Conditional::CACHE;

### don't have Module::Load::Conditional issue warnings --
### default is '1'
$Module::Load::Conditional::VERBOSE = 0;

### The last error that happened during a call to 'can_load'
my $err = $Module::Load::Conditional::ERROR;

描述

Module::Load::Conditional 提供了简单的方法,可在运行时查询并可能加载已安装在系统上的任何模块。

它能够一次加载多个模块,如果其中一个无法加载,则不加载任何模块。它还负责任何错误检查等。

方法

$href = check_install( module => NAME [, version => VERSION, verbose => BOOL ] );

check_install 允许您验证某个模块是否已安装。您可以使用以下参数调用它

module

您希望验证的模块的名称 -- 这是必需的键

version

此模块需要的版本 -- 这是可选的

verbose

是否详细说明其正在执行的操作 -- 它将默认为 $Module::Load::Conditional::VERBOSE

如果找不到模块的安装位置,它将返回 undef,如果找到文件,它将返回带有以下键的哈希引用

file

包含模块的文件的完整路径

dir

目录,或更确切地说,加载模块的 @INC 条目。

version

已安装模块的版本号 - 如果模块没有(或无法解析的)版本号,或者将变量 $Module::Load::Conditional::FIND_VERSION 设置为 true,则此版本号将为 undef。(有关详细信息,请参见下面的 全局变量 部分)

uptodate

布尔值,指示是否发现模块至少为指定的版本。如果您没有指定版本,如果找到模块,uptodate 将始终为 true。如果在模块中未找到可解析的版本,uptodate 也将为 true,因为 check_install 没有明确验证的方法。

另请参见 $Module::Load::Conditional::DEPRECATED,它会影响此值的结果。

$bool = can_load( modules => { NAME => VERSION [,NAME => VERSION] }, [verbose => BOOL, nocache => BOOL, autoload => BOOL] )

can_load 将获取模块列表(可选地带有版本号),并确定是否能够加载它们。如果它可以加载它们中的 *全部*,它就会加载。如果一个或多个无法加载,则不会加载任何一个。

如果您有多种方法 (tm) 来解决程序中的问题,并且仅希望在可以加载所有模块时继续执行,并且在无法加载时不加载它们,这将特别有用。

此函数在底层使用 Module::Load 中的 load 函数或 autoload_remote 函数。

can_load 采用以下参数

模块

这是模块/版本对的哈希引用。版本指示要加载的最小版本。如果没有提供版本,则假定任何版本都足够好。

详细

这控制如果模块加载失败是否应打印警告。默认值是使用 $Module::Load::Conditional::VERBOSE 的值。

不缓存

can_load 将其结果保存在缓存中,因此它不会加载同一个模块两次,也不会尝试加载之前已加载失败的模块。默认情况下,can_load 将检查其缓存,但您可以通过将 nocache 设置为 true 来覆盖它。

自动加载

这控制是否将已加载模块的函数导入到调用方包。默认是不导入任何函数。

有关详细信息,请参阅 Module::Load 中的 autoload 函数和 autoload_remote 函数。

@list = requires( MODULE );

requires 可以告诉您特定模块需要哪些其他模块。当您打算编写一个模块以公开发布并列出其先决条件时,这尤其有用。

requires 只接受一个参数:模块的名称。然后,它将首先检查它是否可以实际加载此模块,如果不能,则返回未定义。否则,它将返回一个模块和编译指令列表,这些模块和编译指令将代表模块加载。

注意:require 返回的列表源自您当前的 perl 和当前安装。

全局变量

可以通过更改以下全局变量来改变 Module::Load::Conditional 的行为

$Module::Load::Conditional::VERBOSE

这控制 Module::Load::Conditional 是否会发出警告和解释,说明某些事情可能失败的原因。如果您将其设置为 0,Module::Load::Conditional 将不会输出任何警告。默认值为 0;

$Module::Load::Conditional::FIND_VERSION

这控制 Module::Load::Conditional 是否会尝试解析(并求值)您尝试加载的模块的版本。

如果您不想这样做,请将此变量设置为 false。然后理解版本比较是不可能的,Module::Load::Conditional 无法告诉您已安装的模块版本。从安全或性能的角度来看,这可能是可取的。请注意,$FIND_VERSION 代码在 taint 模式 下安全运行。

默认值为 1;

$Module::Load::Conditional::CHECK_INC_HASH

这控制 Module::Load::Conditional 是否检查您的 %INC 哈希表以查看模块是否可用。默认情况下,仅扫描 @INC 以查看模块是否物理存在于您的文件系统上,或是否可通过 @INC 钩子 获得。将此变量设置为 true 将信任 %INC 中的任何条目并为您返回它们。

默认值为 0;

$Module::Load::Conditional::FORCE_SAFE_INC

此选项控制 Module::Load::Conditional 是否通过移除“.”来清理 @INC。当前默认设置为 0,但此设置在未来版本中可能会发生改变。

$Module::Load::Conditional::CACHE

此选项保存 can_load 函数的缓存。如果你明确希望移除当前缓存,则可以将此变量设置为 undef

$Module::Load::Conditional::ERROR

此选项保存 can_load 调用期间发生的最后一个错误的字符串。当 can_load 返回 undef 时,此选项非常有用。

$Module::Load::Conditional::DEPRECATED

此选项控制 Module::Load::Conditional 是否检查双生命周期核心模块是否已弃用。如果此选项设置为 true,则如果发现从 $Config{privlibexp} 加载了双生命周期模块,check_install 将向 uptodate 返回 false。

默认值为 0;

另请参阅

Module::Load

错误报告

请将错误或其他问题报告给 <[email protected]>。

作者

此模块由 Jos Boumans <[email protected]> 编写。

版权

此库是免费软件;你可以根据与 Perl 相同的条款重新分发和/或修改它。