Module::Metadata - 从 Perl 模块文件中收集包和 POD 信息
版本 1.000037
use Module::Metadata;
# information about a .pm file
my $info = Module::Metadata->new_from_file( $file );
my $version = $info->version;
# CPAN META 'provides' field for .pm files in a directory
my $provides = Module::Metadata->provides(
dir => 'lib', version => 2
);
此模块提供了一种标准方法,通过(主要是)静态分析和(一些)代码执行来收集有关 .pm 文件的元数据。在确定模块的版本时,$VERSION 赋值会被 eval,这在 CPAN 工具链中是传统的做法。
new_from_file($filename, collect_pod => 1, decode_pod => 1)根据文件路径构造一个 Module::Metadata 对象。如果文件名不存在,则返回 undef。
collect_pod 是一个可选的布尔参数,用于确定是否收集和存储 POD 数据以供参考。默认情况下不收集 POD 数据。POD 标题始终会被收集。
如果文件以 UTF-8、UTF-16BE 或 UTF-16LE 字节顺序标记开头,则在处理之前会跳过它,并且从 perl 5.8 开始,文件的原始内容也会被相应地解码。
或者,如果设置了 decode_pod,它将根据 =encoding 声明解码收集的 pod 部分。
new_from_handle($handle, $filename, collect_pod => 1, decode_pod => 1)这与 new_from_file 类似,只是可以将句柄作为第一个参数提供。
请注意,没有验证来确认句柄是一个句柄,或者可以像句柄一样工作的东西。传递不是句柄的东西会导致在尝试从中读取时出现异常。filename 参数是必需的,否则将返回 undef。
如果需要,您负责在 $handle 上设置解码层。
new_from_module($module, collect_pod => 1, inc => \@dirs, decode_pod => 1)根据模块或包名构造一个 Module::Metadata 对象。如果找不到模块,则返回 undef。
除了接受上面描述的 collect_pod 和 decode_pod 参数外,此方法还接受一个 inc 参数,它是一个指向要搜索模块的目录数组的引用。如果没有给出,则默认为 @INC。
如果包含模块的文件以 UTF-8、UTF-16BE 或 UTF-16LE 字节顺序标记开头,则在处理之前会跳过它,并且从 perl 5.8 开始,文件的原始内容也会被相应地解码。
find_module_by_name($module, \@dirs)根据模块或包名返回模块的路径。可以将目录列表作为可选参数传递,否则将搜索 @INC。
可以作为对象或类方法调用。
find_module_dir_by_name($module, \@dirs)返回包含模块 $module 的 @dirs(或默认情况下为 @INC)中的条目。可以将目录列表作为可选参数传递,否则将搜索 @INC。
可以作为对象或类方法调用。
provides( %options )这是一个围绕 package_versions_from_directory 的便捷包装器,用于生成 CPAN META provides 数据结构。它接受键值对。有效的选项键包括
指定应使用哪个版本的 CPAN::Meta::Spec 作为 provides 输出的格式。目前仅支持 '1.4' 和 '2'(它们的格式相同)。随着 provides 定义的改变,这在将来可能会改变。
version 选项是必需的。如果省略或给出不支持的版本,则 provides 将抛出错误。
递归搜索 .pm 文件的目录。不能与 files 一起指定。
要检查的文件的数组引用。不能与 dir 一起指定。
要添加到结果输出的 file 字段之前的字符串。这默认为 lib,这是大多数 CPAN 发行版在其 lib 中包含 .pm 文件的常见情况。此选项确保 META 信息具有正确的相对路径,即使 dir 或 files 参数是绝对路径或来自发行版根目录以外的位置的相对路径。
例如,给定 dir 为 'lib' 和 prefix 为 'lib',返回值是一个哈希引用,其形式为
{
'Package::Name' => {
version => '0.123',
file => 'lib/Package/Name.pm'
},
'OtherPackage::Name' => ...
}
package_versions_from_directory($dir, \@files?)扫描 $dir 中的 .pm 文件(除非给出 @files,在这种情况下会查找 $dir 中的这些文件 - 并读取每个文件以获取包和版本,返回一个哈希引用,其形式为
{
'Package::Name' => {
version => '0.123',
file => 'Package/Name.pm'
},
'OtherPackage::Name' => ...
}
DB 和 main 包始终被省略,任何在命名空间中以下划线开头的“私有”包(例如 Foo::_private)也会被省略
请注意,如果指定了 $dir,则文件路径相对于 $dir。这不能直接用于 CPAN META provides。请参阅 provides 方法。
log_info (internal)在内部用于执行日志记录;如果已加载 Log::Contextual,则从 Log::Contextual 导入,否则只调用 warn。
name()返回此模块所代表的包的名称。如果有多个包,它会根据文件名做出最佳猜测。如果它是一个脚本(即不是 *.pm),则包名为 'main'。
version($package)返回由 $VERSION 变量定义的版本,该变量用于由 name 方法返回的包,如果未提供参数。如果给定一个包的名称,它将尝试返回该包的版本,如果该版本在文件中指定。
filename()返回文件的绝对路径。请注意,此文件可能实际上尚未存在于磁盘上,例如,如果模块是从内存中的文件句柄中读取的。
packages_inside()返回一个包列表。注意:这是一个发现的原始包列表(或者在 main 的情况下是假设的)。它不会像 provides 方法那样过滤掉 DB、main 或私有包。无效的包名不会返回,例如 "Foo:Bar"。奇怪但有效的包名将被返回,例如 "Foo::Bar::",并由调用者决定如何处理。
pod_inside()返回一个 POD 部分列表。
contains_pod()如果文件中存在任何 POD,则返回 true。
pod($section)返回给定部分中的 POD 数据。
is_indexable($package) 或 is_indexable()从版本 1.000020 开始可用。
返回一个布尔值,指示该包(如果提供)或任何包(否则)是否符合 PAUSE(Perl 作者上传服务器)的索引资格。注意这仅检查有效的 package 声明,不考虑任何所有权信息。
可以通过 RT 缺陷追踪器(或 bug-Module-Metadata@rt.cpan.org)提交缺陷。
此外,还有一个供此发行版用户使用的邮件列表,地址为 http://lists.perl.org/list/cpan-workers.html。
此外,还有一个供此发行版用户使用的 IRC 频道,地址为 irc.perl.org 上的 #toolchain。
原始代码来自 Ken Williams <kwilliams@cpan.org> 和 Randy W. Sims <RandyS@ThePierianSpring.org> 编写的 Module::Build::ModuleInfo。
由 Matt S Trout (mst) <mst@shadowcat.co.uk> 发布为 Module::Metadata,并得到 David Golden (xdg) <dagolden@cpan.org> 的协助。
Karen Etheridge <ether@cpan.org>
David Golden <dagolden@cpan.org>
Vincent Pit <perl@profvince.com>
Matt S Trout <mst@shadowcat.co.uk>
Chris Nehren <apeiron@cpan.org>
Tomas Doran <bobtfish@bobtfish.net>
Olivier Mengué <dolmen@cpan.org>
Graham Knop <haarg@haarg.org>
tokuhirom <tokuhirom@gmail.com>
Tatsuhiko Miyagawa <miyagawa@bulknews.net>
Christian Walde <walde.christian@googlemail.com>
Leon Timmermans <fawaka@gmail.com>
Peter Rabbitson <ribasushi@cpan.org>
Steve Hay <steve.m.hay@googlemail.com>
Jerry D. Hedden <jdhedden@cpan.org>
Craig A. Berry <cberry@cpan.org>
Craig A. Berry <craigberry@mac.com>
David Mitchell <davem@iabyn.com>
David Steinbrunner <dsteinbrunner@pobox.com>
Edward Zborowski <ed@rubensteintech.com>
Gareth Harper <gareth@broadbean.com>
James Raspass <jraspass@gmail.com>
Chris 'BinGOs' Williams <chris@bingosnet.co.uk>
Josh Jore <jjore@cpan.org>
Kent Fredric <kentnl@cpan.org>
原始代码版权所有 (c) 2001-2011 Ken Williams。附加代码版权所有 (c) 2010-2011 Matt Trout 和 David Golden。保留所有权利。
此库是免费软件;您可以在 Perl 本身相同的条款下重新分发和/或修改它。