CPAN::Meta::Spec - CPAN 分发元数据规范
版本 2.150010
my $distmeta = {
name => 'Module-Build',
abstract => 'Build and install Perl modules',
description => "Module::Build is a system for "
. "building, testing, and installing Perl modules. "
. "It is meant to ... blah blah blah ...",
version => '0.36',
release_status => 'stable',
author => [
'Ken Williams <[email protected]>',
'Module-Build List <[email protected]>', # additional contact
],
license => [ 'perl_5' ],
prereqs => {
runtime => {
requires => {
'perl' => '5.006',
'ExtUtils::Install' => '0',
'File::Basename' => '0',
'File::Compare' => '0',
'IO::File' => '0',
},
recommends => {
'Archive::Tar' => '1.00',
'ExtUtils::Install' => '0.3',
'ExtUtils::ParseXS' => '2.02',
},
},
build => {
requires => {
'Test::More' => '0',
},
}
},
resources => {
license => ['https://dev.perl5.cn/licenses/'],
},
optional_features => {
domination => {
description => 'Take over the world',
prereqs => {
develop => { requires => { 'Genius::Evil' => '1.234' } },
runtime => { requires => { 'Machine::Weather' => '2.0' } },
},
},
},
dynamic_config => 1,
keywords => [ qw/ toolchain cpan dual-life / ],
'meta-spec' => {
version => '2',
url => 'https://metacpan.org/pod/CPAN::Meta::Spec',
},
generated_by => 'Module::Build version 0.36',
};
本文档描述了 CPAN 分发元数据规范的版本 2,也称为“CPAN 元数据规范”。
此规范的修订版,用于更正错别字和澄清措辞,可能会作为 CPAN::Meta::Spec 2.x 发布。这些修订版永远不会更改语义或添加或删除指定的行为。
分发元数据描述了 Perl 分发的重要属性。分发构建工具,如 Module::Build、Module::Install、ExtUtils::MakeMaker 或 Dist::Zilla,应根据此规范创建元数据文件,并将其包含在分发中,供自动工具使用,这些工具索引、检查、打包或安装 Perl 分发。
这是元数据描述的主要对象。在本文件上下文中,它通常指的是为其他开发人员使用而一起分发的模块、脚本和/或文档的集合。分发的示例包括 Class-Container
、libwww-perl
或 DBI
。
这指的是包含在单个文件中的可重用代码库。模块通常包含一个或多个包,并且通常用可以映射到文件名的主包的名称来引用。例如,人们可能会引用 File::Spec
而不是 File/Spec.pm
这指的是用 Perl package
语句声明的命名空间。在 Perl 中,包通常具有由命名空间中的 $VERSION
变量给出的版本号属性。
这指的是读取元数据文件、将其反序列化为内存中的数据结构或解释元数据元素的数据结构的代码。
这指的是构建元数据数据结构、将其序列化为字节流和/或将其写入磁盘的代码。
这些术语的解释如 IETF RFC 2119 中所述。
在 "STRUCTURE" 部分中描述的字段描述了数据元素,每个数据元素都具有一个关联的数据类型,如本文所述。有四种基本类型:布尔型、字符串型、列表型和映射型。其他类型是基本类型的子类型,定义了复合数据结构或定义了数据元素值的约束。
布尔型 用于提供真或假值。它必须表示为定义的值,该值要么是“1”要么是“0”,要么字符串化为这些值。
字符串型 是一个数据元素,包含一个非零长度的 Unicode 字符序列,例如一个普通的 Perl 标量,它不是一个引用。
列表型 是一个有序的集合,包含零个或多个数据元素。列表中的元素可以是混合类型的。
生产者必须使用一个数据结构来表示列表元素,该结构明确地表明多个值是可能的,例如对 Perl 数组的引用(“数组引用”)。
期望列表的消费者必须将字符串视为等效于长度为 1 的列表。
映射型 是一个无序的集合,包含零个或多个数据元素(“值”),由关联的字符串元素(“键”)索引。映射的值元素可以是混合类型的。
许可证字符串 是字符串的子类型,具有受限的值集。有效值在 "license" 字段的描述中详细说明。
URL 是字符串的子类型,包含统一资源定位符或标识符。[ 这种类型被称为 URL 而不是 URI,这是出于历史原因。 ]
版本 是字符串的子类型,包含一个描述包或发行版版本号的值。格式限制在 "版本格式" 部分中详细说明。
版本范围 类型是字符串的子类型。它描述了可能存在或安装以满足先决条件的版本的范围。它在 "版本范围" 部分中详细说明。
元数据结构是类型为映射的数据元素。本节描述了映射中有效的键。
本规范文档中未描述的任何键(无论是顶级键还是本文档中描述的复合数据结构中的键)都被视为自定义键,并且必须以“x”或“X”开头,后跟下划线;即它们必须符合模式:qr{\Ax_}i
。如果自定义键引用复合数据结构,则其中的子键不需要“x_”或“X_”前缀。
元数据使用者可以忽略任何或所有自定义键。本文档中未描述的所有其他键均无效,使用者应忽略。生产者不得生成或输出无效键。
对于每个键,都提供了一个示例,后跟描述。描述以添加键或修改定义的规范版本开始,然后是键是必需还是可选,以及相应数据元素的数据类型。这些项目分别用括号、方括号和大括号表示。
如果数据类型是 Map 或 Map 子类型,则也将描述有效的子键。
某些字段标记为已弃用。这些字段出于历史背景显示,不得在版本 2 或更高版本的任何元数据结构中生成或使用。
示例
abstract => 'Build and install Perl modules'
(规范 1.2) [必需] {字符串}
这是对分发目的的简短描述。
示例
author => [ 'Ken Williams <[email protected]>' ]
(规范 1.2) [必需] {一个或多个字符串的列表}
此列表指示与分发相关的联系人。联系字符串的首选形式是
contact-name <email-address>
此字段提供一个通用联系列表,独立于 "resources" 字段中提供的其他结构化字段,例如 bugtracker
。可以联系收件人以了解任何目的,包括但不限于分发的(安全)问题、有关分发的问题或分发中的错误。
分发的原始作者通常是此字段中列出的联系人。除了或代替原始作者,还可以列出分发的共同维护者、继任维护者或专门用于分发的邮件列表。
示例
dynamic_config => 1
(规范 2) [必需] {布尔值}
一个布尔标志,指示是否必须执行Build.PL 或 Makefile.PL(或类似文件)来确定先决条件。
如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),
注意:当此字段为真时,配置后的先决条件不保证与元数据中声明的先决条件有任何关系,依赖于它们这样做是错误的。另请参阅实施者说明中的"动态配置发行版的先决条件"。
此字段明确不指示是否可以在不使用 Makefile 或 Build 文件的情况下安全地执行安装,因为可能存在要安装的特殊文件或自定义安装目标(例如,对于在 CPAN 和 Perl 核心上都存在的双重生命周期模块)。此字段仅定义先决条件是否与元数据中给出的先决条件完全相同。
示例
generated_by => 'Module::Build version 0.36'
(规范 1.0) [必需] {字符串}
此字段指示用于创建此元数据的工具。此字段没有定义的语义,但传统上使用“Generating::Package version 1.23”形式的字符串,或者如果文件是手动生成的,则使用作者的姓名。
示例
license => [ 'perl_5' ]
license => [ 'apache_2_0', 'mozilla_1_0' ]
(规范 2) [必需] {一个或多个许可证字符串的列表}
一个或多个适用于发行版中部分或全部文件的许可证。如果列出了多个许可证,则应查阅发行版文档以澄清对多个许可证的解释。
以下许可证字符串列表有效
string description
------------- -----------------------------------------------
agpl_3 GNU Affero General Public License, Version 3
apache_1_1 Apache Software License, Version 1.1
apache_2_0 Apache License, Version 2.0
artistic_1 Artistic License, (Version 1)
artistic_2 Artistic License, Version 2.0
bsd BSD License (three-clause)
freebsd FreeBSD License (two-clause)
gfdl_1_2 GNU Free Documentation License, Version 1.2
gfdl_1_3 GNU Free Documentation License, Version 1.3
gpl_1 GNU General Public License, Version 1
gpl_2 GNU General Public License, Version 2
gpl_3 GNU General Public License, Version 3
lgpl_2_1 GNU Lesser General Public License, Version 2.1
lgpl_3_0 GNU Lesser General Public License, Version 3.0
mit MIT (aka X11) License
mozilla_1_0 Mozilla Public License, Version 1.0
mozilla_1_1 Mozilla Public License, Version 1.1
openssl OpenSSL License
perl_5 The Perl 5 License (Artistic 1 & GPL 1 or later)
qpl_1_0 Q Public License, Version 1.0
ssleay Original SSLeay License
sun Sun Internet Standards Source License (SISSL)
zlib zlib License
以下许可证字符串也有效,并指示上述未描述的其他许可证
string description
------------- -----------------------------------------------
open_source Other Open Source Initiative (OSI) approved license
restricted Requires special permission from copyright holder
unrestricted Not an OSI approved license, but not restricted
unknown License not provided in metadata
所有其他字符串在许可证字段中无效。
示例
'meta-spec' => {
version => '2',
url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
}
(规范 1.2) [必需] {映射}
此字段指示应使用哪个版本的 CPAN 元数据规范来解释元数据。使用者必须尽快检查此键,如果使用者不支持元数据规范版本,则中止进一步的元数据处理。
以下键有效,但只有version
是必需的。
此子键给出生成文档时使用的 CPAN 元数据规范的整数版本。
这是与给定版本相对应的元数据规范文档的URL。这严格用于人类消费,不应影响文档的解释。
对于版本 2 规范,建议使用以下任一方法
https://metacpan.org/pod/CPAN::Meta::Spec
http://search.cpan.org/perldoc?CPAN::Meta::Spec
示例
name => 'Module-Build'
(规范 1.0) [必需] {字符串}
此字段是发行版的名称。这通常是通过获取发行版中的“主包”并将::
更改为-
来创建的,但名称可能与发行版中的包完全无关。例如,LWP::UserAgent作为发行版名称“libwww-perl”的一部分进行分发。
示例
release_status => 'stable'
(规范 2) [必需] {字符串}
此字段提供此发行版的发布状态。如果version
字段包含下划线字符,则release_status
不能为“stable”。
release_status
字段必须具有以下值之一
这表示一个普通的“最终”版本,应该由 PAUSE 或其他索引器索引。
这表示一个“beta”版本,该版本基本完成,但存在较高的错误风险,需要额外的测试。不应在没有用户明确请求或其他确认的情况下,将此发行版安装在稳定版本之上。此发布状态也可以用于发行版的“候选版本”。
这表示一个“alpha”版本,该版本正在积极开发中,但已发布以供早期反馈或测试,可能缺少功能或存在严重错误。不应在没有用户明确请求或其他确认的情况下,将此发行版安装在稳定版本之上。
消费者可以使用此字段来确定如何为 CPAN 或其他存储库索引发行版,以补充或替代基于版本号或文件名启发式方法。
示例
version => '0.36'
(Spec 1.0) [required] {Version}
此字段提供元数据结构所指发行版的版本。
示例
description => "Module::Build is a system for "
. "building, testing, and installing Perl modules. "
. "It is meant to ... blah blah blah ...",
(Spec 2) [optional] {String}
比abstract
键提供的更长、更完整的描述发行版目的或预期用途的描述。
示例
keywords => [ qw/ toolchain cpan dual-life / ]
(Spec 1.1) [optional] {List of zero or more Strings}
描述此发行版的关键字列表。关键字不能包含空格。
示例
no_index => {
file => [ 'My/Module.pm' ],
directory => [ 'My/Private' ],
package => [ 'My::Module::Secret' ],
namespace => [ 'My::Module::Sample' ],
}
(Spec 1.2) [optional] {Map}
此映射描述了对发行版的打包或实现私有的任何文件、目录、包和命名空间,这些文件、目录、包和命名空间应被索引或搜索工具忽略。请注意,这是一个排除列表,规范没有定义要包含的内容 - 有关更多信息,请参阅实现者说明中的"按 PAUSE 方式索引发行版"。
有效的子键如下
文件相对路径的列表。路径必须使用 Unix 约定指定。
目录相对路径的列表。路径必须使用 Unix 约定指定。
[ 注意:规范的先前版本使用dir
而不是directory
]
包名称的列表。
包命名空间的列表,其中命名空间以下的任何内容都必须忽略,但不包括命名空间本身。
在上面的 no_index
示例中,My::Module::Sample::Foo
将被忽略,但 My::Module::Sample
不会。
示例
optional_features => {
sqlite => {
description => 'Provides SQLite support',
prereqs => {
runtime => {
requires => {
'DBD::SQLite' => '1.25'
}
}
}
}
}
(规范 2) [可选] {Map}
此 Map 描述了具有增量先决条件的可选功能。optional_features
Map 的每个键都是一个用于标识功能的字符串,每个值都是一个包含有关该功能的附加信息的 Map。有效的子键包括
这是一个描述该功能的字符串。每个可选功能都应提供描述
此条目是必需的,其结构与 "prereqs"
键的结构相同。它提供了一个必须满足才能支持或启用该功能的包需求列表。
有一个至关重要的限制:可选功能的先决条件不能包含 configure
阶段的先决条件。
消费者不能在没有用户明确指示的情况下(无论是通过交互式提示、函数参数还是配置值等)将可选功能作为先决条件。
如果消费者使用可选功能来添加额外的先决条件,则消费者应使用相同的语义将可选功能先决条件合并到 prereqs
键给出的先决条件中。有关合并先决条件的详细信息,请参阅 "合并和解析先决条件"。
弃用建议:由于目前没有办法让发行版指定对另一个依赖项的可选功能的依赖关系,因此不建议使用 optional_feature
。相反,创建一个单独的可安装发行版,以确保所需的功能可用。例如,如果 Foo::Bar
具有 Baz
功能,则发布一个单独的 Foo-Bar-Baz
发行版,以满足该功能的要求。
示例
prereqs => {
runtime => {
requires => {
'perl' => '5.006',
'File::Spec' => '0.86',
'JSON' => '2.16',
},
recommends => {
'JSON::XS' => '2.26',
},
suggests => {
'Archive::Tar' => '0',
},
},
build => {
requires => {
'Alien::SDL' => '1.00',
},
},
test => {
recommends => {
'Test::Deep' => '0.10',
},
}
}
(规范 2) [可选] {Map}
这是一个描述分发所有先决条件的映射。键是活动阶段,例如configure
、build
、test
或runtime
。值是映射,其中键命名先决条件关系的类型,例如requires
、recommends
或suggests
,而值提供一组先决条件关系。关系集**必须**指定为包名称到版本范围的映射。
此字段的完整定义在"Prereq Spec"部分给出。
示例
provides => {
'Foo::Bar' => {
file => 'lib/Foo/Bar.pm',
version => '0.27_02',
},
'Foo::Bar::Blah' => {
file => 'lib/Foo/Bar/Blah.pm',
},
'Foo::Bar::Baz' => {
file => 'lib/Foo/Bar/Baz.pm',
version => '0.3',
},
}
(Spec 1.2) [optional] {Map}
这描述了此分发提供的全部包。此信息由分发和自动化机制(如 PAUSE、CPAN、metacpan.org 和 search.cpan.org)用于构建索引,说明在哪个分发中可以找到各种包。
provides
的键是可以在分发中找到的包名称。如果提供了包名称键,则它必须具有以下有效子键的映射
此字段是必需的。它必须包含从分发目录根目录到包含或生成包的文件的 Unix 风格相对文件路径。它可以作为META.yml
或META.json
给出,以声明要索引的包,而无需*.pm
。
如果存在,此字段必须包含包的版本字符串。如果包没有$VERSION
,则必须省略此字段。
示例
resources => {
license => [ 'https://dev.perl5.cn/licenses/' ],
homepage => 'http://sourceforge.net/projects/module-build',
bugtracker => {
web => 'http://rt.cpan.org/Public/Dist/Display.html?Name=CPAN-Meta',
mailto => '[email protected]',
},
repository => {
url => 'git://github.com/dagolden/cpan-meta.git',
web => 'http://github.com/dagolden/cpan-meta',
type => 'git',
},
x_twitter => 'http://twitter.com/cpan_linked/',
}
(规范 2) [可选] {Map}
此字段描述与此分发相关的资源。
有效子键包括
此项目在网络上的官方主页。
与此分发许可证相关的URL列表。与顶层license
字段一样,应参考分发文档以澄清此处提供的多个许可证的解释。
此条目描述了此分发的错误跟踪系统。它是一个具有以下有效键的映射
web - a URL pointing to a web front-end for the bug tracker
mailto - an email address to which bugs can be sent
此条目描述了此发行版的源代码控制存储库。它是一个 Map,包含以下有效键
url - a URL pointing to the repository itself
web - a URL pointing to a web front-end for the repository
type - a lowercase string indicating the VCS used
因为像 http://myrepo.example.com/
这样的 URL 在类型方面是模棱两可的,所以生产者在提供 url
键时应提供 type
。type
字段应为与存储库交互最常用的程序的名称,例如 git
、svn
、cvs
、darcs
、bzr
或 hg
。
(Spec 2 中已弃用) [可选] {String}
已替换为 prereqs
(Spec 2 中已弃用) [可选] {String}
已替换为 prereqs
(Spec 2 中已弃用) [可选] {String}
已替换为 prereqs
(Spec 2 中已弃用) [可选] {String}
此字段表示“模块”或“脚本”,但被认为毫无意义,因为许多发行版都是多种类型事物的混合体。
(Spec 1.2 中已弃用) [可选] {URL}
已替换为 resources
中的 license
(Spec 1.2 中已弃用) [可选] {Map}
此字段已重命名为 "no_index"。
(Spec 2 中已弃用) [可选] {String}
已替换为 prereqs
(Spec 2 中已弃用) [可选] {String}
已替换为 prereqs
本节定义了版本类型,它由 CPAN 元数据规范中的多个字段使用。
版本号必须被视为字符串,而不是数字。例如,1.200
不能序列化为 1.2
。版本比较应委托给 Perl version 模块,版本 0.80 或更高版本。
除非另有说明,否则版本号必须以两种格式之一出现
十进制版本是常规的“十进制数”,但有一些限制。它们必须是非负数,并且必须以数字开头和结尾。可以包含单个下划线,但必须位于两个数字之间。它们不能使用指数表示法(“1.23e-2”)。
version => '1.234' # OK
version => '1.23_04' # OK
version => '1.23_04_05' # Illegal
version => '1.' # Illegal
version => '.1' # Illegal
点分整数(也称为点分十进制)版本由用句点(即“点”、“句号”或“小数点”)分隔的正整数组成。这在格式上等同于 Perl “v-字符串”,但对形式有一些额外的限制。它们必须以“正常”形式给出,即以“v”字符开头,至少包含三个整数组件。为了保留与十进制版本的对应关系,第一个组件之后的组件应限制在 0 到 999 的范围内。最后一个组件可以用下划线字符而不是句点分隔。
version => 'v1.2.3' # OK
version => 'v1.2_3' # OK
version => 'v1.2.3.4' # OK
version => 'v1.2.3_4' # OK
version => 'v2009.10.31' # OK
version => 'v1.2' # Illegal
version => '1.2.3' # Illegal
version => 'v1.2_3_4' # Illegal
version => 'v1.2009.10.31' # Not recommended
某些字段(例如 prereq、optional_features)指示可能作为先决条件所需的某些其他模块的特定版本。本节详细介绍用于提供此信息的版本范围类型。
版本范围的最简单格式只是版本号本身,例如 2.4
。这意味着至少必须存在版本 2.4。要指示任何版本的先决条件都可以,即使先决条件根本没有定义版本,请使用版本 0
。
或者,版本范围可以使用运算符 <(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)和 !=(不等于)。例如,规范 < 2.0
表示小于 2.0 的任何版本的先决条件都是合适的。
对于更复杂的情况,版本规范可以使用逗号进行 AND 连接。规范 >= 1.2, != 1.5, < 2.0
表示必须至少为 1.2、小于 2.0 且不等于 1.5 的版本。
顶级元数据和 optional_features
中的 prereqs
键定义了发行版和其他包之间的关系。先决条件规范结构是一个分层数据结构,它将先决条件划分为安装过程中的阶段和指示如何解析先决条件的关系。
例如,要指定 Data::Dumper
在 test
阶段是required
,此条目将出现在发行版元数据中
prereqs => {
test => {
requires => {
'Data::Dumper' => '2.00'
}
}
}
常规使用的要求必须列在 runtime
阶段。其他要求应列在它们所需的最早阶段,并且使用者必须在执行活动之前累积并满足跨阶段的要求。例如,build
要求也必须在 test
阶段可用。
before action requirements that must be met
---------------- --------------------------------
perl Build.PL configure
perl Makefile.PL
make configure, runtime, build
Build
make test configure, runtime, build, test
Build test
安装发行版的使用者必须确保也安装了runtime 要求,并且可以安装来自其他阶段的依赖项。
after action requirements that must be met
---------------- --------------------------------
make install runtime
Build install
配置阶段发生在尝试任何动态配置之前。配置阶段所需的库必须在执行发行版构建工具之前可用。
构建阶段是指编译发行版的源代码(如果需要)并将其准备安装的过程。
测试阶段是指运行发行版的自动化测试套件。任何仅用于测试而不用于后续使用的库都应在此列出。
运行时阶段不仅指安装发行版的内容,还指其持续使用。任何作为此发行版正常使用先决条件的库都应在此处指出。
开发阶段的先决条件是开发人员在开发发行版源代码时所需的库。这些工具可能需要用于构建发布包、运行作者专用的测试或执行与开发发行版新版本相关的其他任务。
这些依赖项必须安装才能正确完成该阶段。
推荐的依赖项强烈建议安装,并且应在资源受限的环境之外满足。
这些依赖项是可选的,但建议用于增强所述发行版的操作。
当该阶段处于运行状态时,这些库无法安装。这是一种非常罕见的情况,conflicts
关系应谨慎使用,或根本不使用。
每当元数据使用者合并先决条件时,无论是来自不同的阶段还是来自optional_features
,它们都应以保留先决条件结构的预期语义的方式进行合并。通常,这意味着使用逗号连接版本规范,如"版本范围"部分所述。
解析依赖项时可能会出现另一个细微的错误,它源于依赖项中的模块在CPAN上索引到发行版文件的方式。当一个模块从发行版中删除时,调用该模块的依赖项可能会指示应该安装旧的发行版,这可能会覆盖来自较新发行版的文件。
例如,截至2009年10月31日,CPAN索引文件包含以下模块-发行版映射
Class::MOP 0.94 D/DR/DROLSKY/Class-MOP-0.94.tar.gz
Class::MOP::Class 0.94 D/DR/DROLSKY/Class-MOP-0.94.tar.gz
Class::MOP::Class::Immutable 0.04 S/ST/STEVAN/Class-MOP-0.36.tar.gz
考虑“Class::MOP”0.94已安装的情况。如果一个发行版指定“Class::MOP::Class::Immutable”作为依赖项,它可能会导致安装Class-MOP-0.36.tar.gz,覆盖来自Class-MOP-0.94.tar.gz的任何文件。
元数据使用者**应该**测试依赖项是否会导致已安装的模块文件“降级”到旧版本,并且**可以**警告用户或忽略会导致此结果的依赖项。
发行版元数据应序列化(作为哈希引用)为JSON编码数据,并作为文件META.json与发行版一起打包。
过去,发行版元数据结构已与发行版一起打包为META.yml,这是一个YAML Tiny格式的文件(有关详细信息,请参阅YAML::Tiny)。从磁盘使用发行版元数据的工具应该能够加载META.yml,但如果同时存在,则应优先加载META.json。
要从Perl模块中获取版本号,使用者应使用ExtUtils::MakeMaker或Module::Metadata提供的MM->parse_version($file)
方法。例如,对于由$mod
给出的模块,版本可以通过以下方式之一检索
# via ExtUtils::MakeMaker
my $file = MM->_installed_file_for_module($mod);
my $version = MM->parse_version($file)
私有_installed_file_for_module
方法可以替换为其他方法,用于在@INC
中定位模块。
# via Module::Metadata
my $info = Module::Metadata->new_from_module($mod);
my $version = $info->version;
如果只有文件名可用,可以使用以下方法
# via Module::Build
my $info = Module::Metadata->new_from_file($file);
my $version = $info->version;
version模块提供了最可靠的方式来比较版本号,无论它们以何种方式提供或存在于模块中。给定包含版本号的两个字符串$v1
和$v2
,应在使用普通比较运算符之前将它们转换为version
对象。例如
use version;
if ( version->new($v1) <=> version->new($v2) ) {
print "Versions are not equal\n";
}
如果只需要比较已安装的模块是否具有足够高的版本,可以使用eval
的字符串形式和use
函数进行直接测试。例如,对于模块$mod
和版本依赖项$prereq
if ( eval "use $mod $prereq (); 1" ) {
print "Module $mod version is OK.\n";
}
但是,如果$mod
和$prereq
的值未经清理,则会存在安全隐患。
当 dynamic_config
为真时,假设分发元数据中给出的先决条件与分发的实际先决条件有任何关系都是错误的。
然而,在实践中,人们通常可以预期这些先决条件是以下两种情况之一:
分发的最低先决条件,动态配置只会向其中添加项目。
发布时发布者机器上配置的分发。
第二种情况通常会与第一种情况产生相同的结果,尽管只是偶然。
因此,消费者可以使用这些数据进行信息分析,但将其呈现给用户作为规范或依赖于它作为规范无疑是愚蠢的行为。
虽然 no_index
告诉您在索引时必须忽略什么,但此规范对如何获取初始候选索引列表没有意见。对于“正常”分发,您可能考虑简单地索引 lib/
的内容,但 CPAN 上有很多有趣的奇特之处,以及许多来自将主 .pm 文件放在分发存档根目录中的时代的 dists - 因此 PAUSE 目前索引所有 .pm 和 .PL 文件,这些文件既不 (a) 被 no_index
特别排除 (b) 也不在 inc
、xt
或 t
目录中,或者常见的“错误”目录,如 perl5
。
或者:如果您试图像 PAUSE 一样,请确保您跳过 inc
、xt
和 t
以及任何标记为 no_index
的内容。
还要记住:如果 META 文件包含 provides
字段,您就不应该索引任何内容 - 只需使用它。
CPAN,http://www.cpan.org/
JSON,http://json.org/
YAML,http://www.yaml.org/
Ken Williams 在 2003 年编写了最初的 CPAN 元数据规范(也称为“META.yml 规范”),并在社区中不同成员的输入下维护了多个版本。在 2005 年,Randy Sims 将其从 HTML 重写为 POD,用于 1.2 版本。Ken 继续维护该规范,直到 1.4 版本。
在 2009 年底,David Golden 组织了 2.0 版本提案审查流程。David 和 Ricardo Signes 在 2010 年 4 月根据 1.4 版本规范和提案过程中贡献的补丁草拟了最终的 2.0 版本规范。
David Golden <[email protected]>
Ricardo Signes <[email protected]>
Adam Kennedy <[email protected]>
本软件版权 (c) 2010 由 David Golden、Ricardo Signes、Adam Kennedy 和贡献者拥有。
这是一个自由软件;您可以根据与 Perl 5 编程语言系统本身相同的条款重新分发和/或修改它。