结构“提供”的键“文件”如何与“ CPAN :: Meta :: Spec”的“ META。*”一起使用?

时间:2019-02-03 14:52:27

标签: perl dependencies dependency-management cpan metacpan

我正在尝试better understand I could use CPAN::Meta::Spec的作用,并在spec中遇到了以下file关键字:

  

[...]到包含或生成程序包的文件。可以将其指定为META.yml或META.json来声明无需索引* .pm的程序包。

这句话对我来说就像一个人能够使用文件的路径而不是META.*在配置中直接指定一些*.pm。因此,使用措词it显然与前面提到的路径相关。类似于以下示例:

provides => {
  'Foo::Bar' => {
    file    => 'lib/Foo/Bar.pm',
    version => '0.27_02'
  },
  'Foo::Bar2' => {
    file    => 'lib/Foo/Bar2.yml', <-- META.yml?
  },
  'Foo::Bar3' => {
    file    => 'lib/Foo/Bar3.json', <-- META.json?
    version => '0.3'
  }

因此,尽管Foo/Bar2.pmFoo/Bar3.pm可能存在于发行版中,但它们不是显式定义的,而是使用META.*文件隐式定义的。

  1. 这样的META.*看起来如何,它包含什么?只有nameversion之类的东西(本机Perl软件包也可能提供)?还是licensekeyword之类的其他东西,也许除了依赖项以外的所有东西?

  2. CPAN客户端如何处理此类情况? META.*显然不是Perl软件包本身,我不知道它是如何用于生成它的。那么到底在系统中实际安装了什么?有其他机制可以某种方式生成软件包吗?

  3. 如何提供与密钥META.*兼容的*.pm而不是version和以下限制:

  

[...]如果软件包没有$ VERSION,则必须省略此字段。

在这种情况下,META.*是否算作包含$VERSION的包裹?还是期望最终以某种方式生成软件包,并且该软件包也必须同时具有$VERSION,并且只要不生成软件包,就可以简单地使用META.*的版本? / p>

感谢您的澄清!

1 个答案:

答案 0 :(得分:1)

crendential.json元数据是发行版本提供的软件包的列表,主要供PAUSE索引器使用,但也可由分析工具使用。如果存在,则PAUSE将不会检查文件中的软件包及其版本,但会信任provides。对于分发中的每个程序包,它必须列出该程序包所在的文件,以及该程序包的版本(如果有)。由于这是一个“替代”,因此不需要与现实相匹配,但是除非您做的很奇怪,否则应该这样做。如果您的软件包没有关联的文件,那么将文件设置为providesMETA.yml的能力只是一个备用。很少需要执行此操作,并且对META.jsonMETA.json并没有其他要求,除非它们应该存在。与往常一样,在实现中,该元数据始终在分发中包含的META.ymlMETA.json中进行设置。