Как объявить номер версии для модуля Perl?

Я думал, что знаю, как объявлять номера версий для модулей. Но после прочтения статьи "$ VERSION Confusion" в Modern Perl Books, Modern Perl Blog; Я теперь более смущен, чем начал. (Незнание действительно было блаженством.) Не то, чтобы у меня зависания "совершенного" кода, но мне просто очень интересно, почему такой тривиальный вопрос, по-видимому, не имеет окончательного ответа на такой зрелый язык.

Надеемся, что сообщество SO найдет окончательный ответ на этот вопрос, поскольку для взлома Perl есть лучшие вещи, чем спорить о разных способах объявления номеров версий.

Ответ 1

  use Module VERSION

Если аргумент VERSION присутствует между Module и LIST, то use вызовет метод VERSION в классе Module с заданной версией в качестве аргумента. Метод по умолчанию VERSION, унаследованный от класса UNIVERSAL, квакает, если данная версия больше, чем значение переменной $Module::VERSION.

Это делает простой шаблон:

package MyModule;

our $VERSION = 1.23;

# ...

1;

Ответ 2

Моя позиция - это просто. Объявите свою версию как строку, содержащую число с плавающей запятой. Оставьте многозначное значение для номеров версий Perl и Perl 6.

Если вашему модулю требуется Perl 5.6.0 или новее:

our $VERSION = '1.02';

Или, если вам нужно оставаться совместимым с Perl 5.005 или старше:

use vars '$VERSION';
$VERSION = '1.02';

Некоторые дополнительные моменты:

  • Всегда используйте одно и то же число цифр после десятичной точки. Некоторые (не Perl) упаковочные инструменты считают, что версия 1.11 поставляется после 1.9, но до 1.90. Если вам нужно изменить количество цифр, которые вы используете, увеличьте номер основной версии в одно и то же время.

  • Всегда объявлять версию в виде строки.. Это приводит к исчезновению конечных нулей. (См. Пункт 1.)

  • Если вы хотите сделать нестабильную (например, альфа-бета) версию, добавьте строку -TRIAL к номеру версии дистрибутива (например, upload Foo-Bar-1.90-TRIAL.tar.gz, содержащему Foo:: Bar 1.90). Это говорит CPAN, чтобы он был представлен как релиз разработки, как если бы он содержал символ подчеркивания. Dist::Zilla упрощает выпуск пробных версий.

Строка, содержащая число с плавающей запятой, будет работать со всеми версиями Perl, всеми версиями MakeMaker и Module:: Build и всеми дистрибутивами Linux, о которых я знаю.

Ответ 3

Большая часть вашей путаницы, я подозреваю, из-за страницы, на которую вы ссылались, защищали номера версий версии 1.2.3. Они не полностью поддерживаются во всей инструментальной цепочке (независимо от того, что говорят другие) и не должны использоваться. Они не имеют преимуществ по сравнению с простой числовой версией, так как для обеспечения совместимости они должны рассматриваться как число во многих местах (например, 1.2.3 рассматривается как 1.002003).

Правильный способ объявления номера версии прост, если у вас нет компонента XS или индикатора альфа/бета (_ в номере версии), так как некоторые вещи должны видеть строку версии, а некоторые - номер версии, Тогда это усложняется. perlmodstyle обеспечивает правильное заклинание:

Если вы хотите выпустить "бета" или альфа-версия модуля, но не хотите, чтобы CPAN.pm перечислил его как последнее используйте "_" после обычной версии число, за которым следует как минимум 2 цифры, например. 1.20_01. Если вы сделаете это, рекомендуется следующая идиома:

$VERSION = "1.12_01";
$XS_VERSION = $VERSION; # only needed if you have XS code
$VERSION = eval $VERSION;

(Предполагается, что $VERSION и $XS_VERSION уже объявлены, а если нет, просто добавьте our в первые две строки.)