我正在尝试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.pm
和Foo/Bar3.pm
可能存在于发行版中,但它们不是显式定义的,而是使用META.*
文件隐式定义的。
这样的META.*
看起来如何,它包含什么?只有name
和version
之类的东西(本机Perl软件包也可能提供)?还是license
和keyword
之类的其他东西,也许除了依赖项以外的所有东西?
CPAN客户端如何处理此类情况? META.*
显然不是Perl软件包本身,我不知道它是如何用于生成它的。那么到底在系统中实际安装了什么?有其他机制可以某种方式生成软件包吗?
如何提供与密钥META.*
兼容的*.pm
而不是version
和以下限制:
[...]如果软件包没有$ VERSION,则必须省略此字段。
在这种情况下,META.*
是否算作包含$VERSION
的包裹?还是期望最终以某种方式生成软件包,并且该软件包也必须同时具有$VERSION
,并且只要不生成软件包,就可以简单地使用META.*
的版本? / p>
感谢您的澄清!
答案 0 :(得分:1)
crendential.json
元数据是发行版本提供的软件包的列表,主要供PAUSE索引器使用,但也可由分析工具使用。如果存在,则PAUSE将不会检查文件中的软件包及其版本,但会信任provides
。对于分发中的每个程序包,它必须列出该程序包所在的文件,以及该程序包的版本(如果有)。由于这是一个“替代”,因此不需要与现实相匹配,但是除非您做的很奇怪,否则应该这样做。如果您的软件包没有关联的文件,那么将文件设置为provides
或META.yml
的能力只是一个备用。很少需要执行此操作,并且对META.json
或META.json
并没有其他要求,除非它们应该存在。与往常一样,在实现中,该元数据始终在分发中包含的META.yml
和META.json
中进行设置。