内容

名称

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-Containerlibwww-perlDBI

模块

这指的是包含在单个文件中的可重用代码库。模块通常包含一个或多个包,并且通常用可以映射到文件名的主包的名称来引用。例如,人们可能会引用 File::Spec 而不是 File/Spec.pm

这指的是用 Perl package 语句声明的命名空间。在 Perl 中,包通常具有由命名空间中的 $VERSION 变量给出的版本号属性。

消费者

这指的是读取元数据文件、将其反序列化为内存中的数据结构或解释元数据元素的数据结构的代码。

生产者

这指的是构建元数据数据结构、将其序列化为字节流和/或将其写入磁盘的代码。

必须、应该、可以等

这些术语的解释如 IETF RFC 2119 中所述。

数据类型

"STRUCTURE" 部分中描述的字段描述了数据元素,每个数据元素都具有一个关联的数据类型,如本文所述。有四种基本类型:布尔型、字符串型、列表型和映射型。其他类型是基本类型的子类型,定义了复合数据结构或定义了数据元素值的约束。

布尔型

布尔型 用于提供真或假值。它必须表示为定义的值,该值要么是“1”要么是“0”,要么字符串化为这些值。

字符串型

字符串型 是一个数据元素,包含一个非零长度的 Unicode 字符序列,例如一个普通的 Perl 标量,它不是一个引用。

列表型

列表型 是一个有序的集合,包含零个或多个数据元素。列表中的元素可以是混合类型的。

生产者必须使用一个数据结构来表示列表元素,该结构明确地表明多个值是可能的,例如对 Perl 数组的引用(“数组引用”)。

期望列表的消费者必须将字符串视为等效于长度为 1 的列表。

映射型

映射型 是一个无序的集合,包含零个或多个数据元素(“值”),由关联的字符串元素(“键”)索引。映射的值元素可以是混合类型的。

许可证字符串

许可证字符串 是字符串的子类型,具有受限的值集。有效值在 "license" 字段的描述中详细说明。

URL

URL 是字符串的子类型,包含统一资源定位符或标识符。[ 这种类型被称为 URL 而不是 URI,这是出于历史原因。 ]

版本

版本 是字符串的子类型,包含一个描述包或发行版版本号的值。格式限制在 "版本格式" 部分中详细说明。

版本范围

版本范围 类型是字符串的子类型。它描述了可能存在或安装以满足先决条件的版本的范围。它在 "版本范围" 部分中详细说明。

结构

元数据结构是类型为映射的数据元素。本节描述了映射中有效的键。

本规范文档中未描述的任何键(无论是顶级键还是本文档中描述的复合数据结构中的键)都被视为自定义键,并且必须以“x”或“X”开头,后跟下划线;即它们必须符合模式:qr{\Ax_}i。如果自定义键引用复合数据结构,则其中的子键不需要“x_”或“X_”前缀。

元数据使用者可以忽略任何或所有自定义键。本文档中未描述的所有其他键均无效,使用者应忽略。生产者不得生成或输出无效键。

对于每个键,都提供了一个示例,后跟描述。描述以添加键或修改定义的规范版本开始,然后是键是必需还是可选,以及相应数据元素的数据类型。这些项目分别用括号、方括号和大括号表示。

如果数据类型是 Map 或 Map 子类型,则也将描述有效的子键。

某些字段标记为已弃用。这些字段出于历史背景显示,不得在版本 2 或更高版本的任何元数据结构中生成或使用。

必需字段

abstract

示例

abstract => 'Build and install Perl modules'

(规范 1.2) [必需] {字符串}

这是对分发目的的简短描述。

author

示例

author => [ 'Ken Williams <[email protected]>' ]

(规范 1.2) [必需] {一个或多个字符串的列表}

此列表指示与分发相关的联系人。联系字符串的首选形式是

contact-name <email-address>

此字段提供一个通用联系列表,独立于 "resources" 字段中提供的其他结构化字段,例如 bugtracker。可以联系收件人以了解任何目的,包括但不限于分发的(安全)问题、有关分发的问题或分发中的错误。

分发的原始作者通常是此字段中列出的联系人。除了或代替原始作者,还可以列出分发的共同维护者、继任维护者或专门用于分发的邮件列表。

dynamic_config

示例

dynamic_config => 1

(规范 2) [必需] {布尔值}

一个布尔标志,指示是否必须执行Build.PLMakefile.PL(或类似文件)来确定先决条件。

如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),则应将此字段设置为真值。如果分发在配置过程中执行一些动态配置(询问问题、感知环境等),

注意:当此字段为真时,配置后的先决条件不保证与元数据中声明的先决条件有任何关系,依赖于它们这样做是错误的。另请参阅实施者说明中的"动态配置发行版的先决条件"

此字段明确指示是否可以在不使用 Makefile 或 Build 文件的情况下安全地执行安装,因为可能存在要安装的特殊文件或自定义安装目标(例如,对于在 CPAN 和 Perl 核心上都存在的双重生命周期模块)。此字段仅定义先决条件是否与元数据中给出的先决条件完全相同。

generated_by

示例

generated_by => 'Module::Build version 0.36'

(规范 1.0) [必需] {字符串}

此字段指示用于创建此元数据的工具。此字段没有定义的语义,但传统上使用“Generating::Package version 1.23”形式的字符串,或者如果文件是手动生成的,则使用作者的姓名。

license

示例

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

示例

'meta-spec' => {
  version => '2',
  url     => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
}

(规范 1.2) [必需] {映射}

此字段指示应使用哪个版本的 CPAN 元数据规范来解释元数据。使用者必须尽快检查此键,如果使用者不支持元数据规范版本,则中止进一步的元数据处理。

以下键有效,但只有version是必需的。

version

此子键给出生成文档时使用的 CPAN 元数据规范的整数版本

url

这是与给定版本相对应的元数据规范文档的URL。这严格用于人类消费,不应影响文档的解释。

对于版本 2 规范,建议使用以下任一方法

  • https://metacpan.org/pod/CPAN::Meta::Spec

  • http://search.cpan.org/perldoc?CPAN::Meta::Spec

name

示例

name => 'Module-Build'

(规范 1.0) [必需] {字符串}

此字段是发行版的名称。这通常是通过获取发行版中的“主包”并将::更改为-来创建的,但名称可能与发行版中的包完全无关。例如,LWP::UserAgent作为发行版名称“libwww-perl”的一部分进行分发。

release_status

示例

release_status => 'stable'

(规范 2) [必需] {字符串}

此字段提供此发行版的发布状态。如果version字段包含下划线字符,则release_status不能为“stable”。

release_status字段必须具有以下值之一

stable

这表示一个普通的“最终”版本,应该由 PAUSE 或其他索引器索引。

testing

这表示一个“beta”版本,该版本基本完成,但存在较高的错误风险,需要额外的测试。不应在没有用户明确请求或其他确认的情况下,将此发行版安装在稳定版本之上。此发布状态也可以用于发行版的“候选版本”。

unstable

这表示一个“alpha”版本,该版本正在积极开发中,但已发布以供早期反馈或测试,可能缺少功能或存在严重错误。不应在没有用户明确请求或其他确认的情况下,将此发行版安装在稳定版本之上。

消费者可以使用此字段来确定如何为 CPAN 或其他存储库索引发行版,以补充或替代基于版本号或文件名启发式方法。

version

示例

version => '0.36'

(Spec 1.0) [required] {Version}

此字段提供元数据结构所指发行版的版本。

可选字段

description

示例

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

示例

keywords => [ qw/ toolchain cpan dual-life / ]

(Spec 1.1) [optional] {List of zero or more Strings}

描述此发行版的关键字列表。关键字不能包含空格。

no_index

示例

no_index => {
  file      => [ 'My/Module.pm' ],
  directory => [ 'My/Private' ],
  package   => [ 'My::Module::Secret' ],
  namespace => [ 'My::Module::Sample' ],
}

(Spec 1.2) [optional] {Map}

此映射描述了对发行版的打包或实现私有的任何文件、目录、包和命名空间,这些文件、目录、包和命名空间应被索引或搜索工具忽略。请注意,这是一个排除列表,规范没有定义要包含的内容 - 有关更多信息,请参阅实现者说明中的"按 PAUSE 方式索引发行版"

有效的子键如下

file

文件相对路径的列表。路径必须使用 Unix 约定指定。

directory

目录相对路径的列表。路径必须使用 Unix 约定指定。

[ 注意:规范的先前版本使用dir而不是directory ]

package

包名称的列表

命名空间

包命名空间的列表,其中命名空间以下的任何内容都必须忽略,但包括命名空间本身。

在上面的 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}

这是一个描述分发所有先决条件的映射。键是活动阶段,例如configurebuildtestruntime。值是映射,其中键命名先决条件关系的类型,例如requiresrecommendssuggests,而值提供一组先决条件关系。关系集**必须**指定为包名称到版本范围的映射。

此字段的完整定义在"Prereq Spec"部分给出。

provides

示例

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的键是可以在分发中找到的包名称。如果提供了包名称键,则它必须具有以下有效子键的映射

file

此字段是必需的。它必须包含从分发目录根目录到包含或生成包的文件的 Unix 风格相对文件路径。它可以作为META.ymlMETA.json给出,以声明要索引的包,而无需*.pm

version

如果存在,此字段必须包含包的版本字符串。如果包没有$VERSION,则必须省略此字段。

resources

示例

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}

此字段描述与此分发相关的资源。

有效子键包括

homepage

此项目在网络上的官方主页。

license

与此分发许可证相关的URL列表。与顶层license字段一样,应参考分发文档以澄清此处提供的多个许可证的解释。

bugtracker

此条目描述了此分发的错误跟踪系统。它是一个具有以下有效键的映射

web    - a URL pointing to a web front-end for the bug tracker
mailto - an email address to which bugs can be sent
repository

此条目描述了此发行版的源代码控制存储库。它是一个 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 键时应提供 typetype 字段应为与存储库交互最常用的程序的名称,例如 gitsvncvsdarcsbzrhg

已弃用字段

build_requires

(Spec 2 中已弃用) [可选] {String}

已替换为 prereqs

configure_requires

(Spec 2 中已弃用) [可选] {String}

已替换为 prereqs

conflicts

(Spec 2 中已弃用) [可选] {String}

已替换为 prereqs

distribution_type

(Spec 2 中已弃用) [可选] {String}

此字段表示“模块”或“脚本”,但被认为毫无意义,因为许多发行版都是多种类型事物的混合体。

license_uri

(Spec 1.2 中已弃用) [可选] {URL}

已替换为 resources 中的 license

private

(Spec 1.2 中已弃用) [可选] {Map}

此字段已重命名为 "no_index"

recommends

(Spec 2 中已弃用) [可选] {String}

已替换为 prereqs

requires

(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::Dumpertest 阶段是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
配置

配置阶段发生在尝试任何动态配置之前。配置阶段所需的库必须在执行发行版构建工具之前可用。

build

构建阶段是指编译发行版的源代码(如果需要)并将其准备安装的过程。

test

测试阶段是指运行发行版的自动化测试套件。任何仅用于测试而不用于后续使用的库都应在此列出。

runtime

运行时阶段不仅指安装发行版的内容,还指其持续使用。任何作为此发行版正常使用先决条件的库都应在此处指出。

develop

开发阶段的先决条件是开发人员在开发发行版源代码时所需的库。这些工具可能需要用于构建发布包、运行作者专用的测试或执行与开发发行版新版本相关的其他任务。

Relationships

requires

这些依赖项必须安装才能正确完成该阶段。

recommends

推荐的依赖项强烈建议安装,并且应在资源受限的环境之外满足。

suggests

这些依赖项是可选的,但建议用于增强所述发行版的操作。

conflicts

当该阶段处于运行状态时,这些库无法安装。这是一种非常罕见的情况,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模块中提取版本号

要从Perl模块中获取版本号,使用者应使用ExtUtils::MakeMakerModule::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 为真时,假设分发元数据中给出的先决条件与分发的实际先决条件有任何关系都是错误的。

然而,在实践中,人们通常可以预期这些先决条件是以下两种情况之一:

第二种情况通常会与第一种情况产生相同的结果,尽管只是偶然。

因此,消费者可以使用这些数据进行信息分析,但将其呈现给用户作为规范或依赖于它作为规范无疑是愚蠢的行为。

索引分发 à la PAUSE

虽然 no_index 告诉您在索引时必须忽略什么,但此规范对如何获取初始候选索引列表没有意见。对于“正常”分发,您可能考虑简单地索引 lib/ 的内容,但 CPAN 上有很多有趣的奇特之处,以及许多来自将主 .pm 文件放在分发存档根目录中的时代的 dists - 因此 PAUSE 目前索引所有 .pm 和 .PL 文件,这些文件既不 (a) 被 no_index 特别排除 (b) 也不在 incxtt 目录中,或者常见的“错误”目录,如 perl5

或者:如果您试图像 PAUSE 一样,请确保您跳过 incxtt 以及任何标记为 no_index 的内容。

还要记住:如果 META 文件包含 provides 字段,您就不应该索引任何内容 - 只需使用它。

另请参阅

历史

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 版本规范。

作者

版权和许可

本软件版权 (c) 2010 由 David Golden、Ricardo Signes、Adam Kennedy 和贡献者拥有。

这是一个自由软件;您可以根据与 Perl 5 编程语言系统本身相同的条款重新分发和/或修改它。