Как ключ "file" структуры "обеспечивает" работу с "META.*" Для "CPAN::Meta::Spec"?

Я пытаюсь лучше понять, что я мог бы использовать CPAN::Meta::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.* файлы.

  1. Как такое META.* похоже, что в нем содержится? Только такие вещи, как name а также version, что также может обеспечить нативный пакет Perl? Или дополнительные вещи, такие как license а также keywordможет все что кроме зависимостей?

  2. Как CPAN-клиенты обрабатывают такие случаи? META.* очевидно, это не сам пакет Perl, и я не понимаю, как он используется для его генерации. Так что же на самом деле устанавливается в систему? Есть ли какой-то дополнительный механизм генерации пакета как-то?

  3. Как обеспечивает META.* вместо *.pm совместим с ключом version и следующее ограничение:

[...] Если пакет не имеет $VERSION, это поле должно быть пропущено.

Есть ли META.* считать как пакет, содержащий $VERSION в этом случае? Или ожидается, что каким-то образом пакет будет сгенерирован в конце, и это просто должно иметь $VERSION и до тех пор, пока пакет не сгенерирован, версия META.* можно просто использовать?

Спасибо за ваше разъяснение!

1 ответ

provides метаданные - это список пакетов, предоставляемых дистрибутивом, главным образом для использования индексатором PAUSE, но также могут использоваться инструментами анализа. Если он присутствует, PAUSE не будет проверять ваши файлы на наличие пакетов и их версий, но будет доверять provides, Для каждого пакета в дистрибутиве должен быть указан файл, в котором находится пакет, и версия пакета, если он есть. Поскольку это "переопределение", оно не обязательно должно соответствовать реальности, но если вы не делаете что-то очень странное, это должно произойти. Возможность установить файл в META.yml или же META.json просто запасной вариант, если у вас есть пакет, с которым нет связанного файла; это крайне редко, что вам нужно будет сделать это, и это не накладывает никаких дополнительных требований на META.json или же META.yml кроме того, что они должны существовать. Как всегда, в реализации эти метаданные всегда устанавливаются в META.json а также META.yml входит в дистрибутив.

Другие вопросы по тегам