如何声明Perl模块的版本号?

时间:2010-08-24 01:36:21

标签: perl syntax coding-style

我以为我知道如何声明模块的版本号。但是在Modern Perl Books, a Modern Perl Blog阅读了文章“$ VERSION Confusion”之后;我现在比起初更困惑。 (无知确实很幸福。)并不是说我有关于“完美”代码的问题,但我真的很好奇为什么这样一个微不足道的问题显然没有这种成熟语言的明确答案。

希望SO社区能够找到这个问题的明确答案,因为Perl黑客可以做更好的事情而不是争论声明版本号的不同方法。

4 个答案:

答案 0 :(得分:11)

  

use Module VERSION

     

如果Module和LIST之间存在VERSION参数,那么use将调用类VERSION中的Module方法,并将给定版本作为参数。如果给定版本大于变量VERSION的值,则从UNIVERSAL类继承的默认$Module::VERSION方法会突然显示。

这使得一个简单的模式:

package MyModule;

our $VERSION = 1.23;

# ...

1;

答案 1 :(得分:10)

我的立场是保持简单将您的版本声明为包含浮点数的字符串。为Perl的版本号和Perl 6保留多位小数。

如果您的模块需要Perl 5.6.0或更高版本:

our $VERSION = '1.02';

或者,如果您需要与Perl 5.005或更早版本兼容:

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

其他一些要点:

  1. 始终在小数点后使用相同的位数。某些(非Perl)打包工具认为版本1.11在1.9之后但在1.90之前。如果您需要更改使用的位数,请同时增加主版本号。

  2. 始终将版本声明为字符串。这会使尾随零消失。 (见第1点。)

  3. 如果您想要发布不稳定(例如alpha或beta)版本,请将字符串-TRIAL附加到发行版的版本号(例如上传Foo-Bar-1.90-TRIAL.tar.gz Foo :: Bar 1.90)。这告诉CPAN将其列为开发版本,就像它包含下划线一样。 Dist::Zilla可以轻松制作试用版。

  4. 包含浮点数的字符串适用于所有版本的Perl,所有版本的MakeMaker& Module :: Build,以及我所知道的所有Linux发行版。

答案 2 :(得分:7)

我怀疑,由于您链接的页面提倡1.2.3样式版本“数字”,因此您的大多数困惑都是。在所有工具链中都没有完全支持这些(不管别人怎么说),不应该使用它们。它们没有优于简单数字版本的优势,因为它们必须兼容性在许多地方被视为一个数字(例如1.2.3被视为1.002003)。

声明版本号的正确方法很简单,除非您有XS组件或alpha / beta指示符(版本号中的_),因为有些东西需要查看版本字符串,有些东西需要版本号。然后它变得更复杂。 perlmodstyle提供了正确的咒语:

  

如果你想发布'beta'或   模块的'alpha'版本,但不是   希望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添加到前两行。)

答案 3 :(得分:0)

perl 版本的标准在模块 version 中描述,有两种类型:

  1. 点分十进制样式,类似于 perl 本身使用的样式,即 v5.8.32 或只是 5.8.32;或
  2. 十进制样式,例如 1.0203

点分十进制格式,这是推荐的样式,三位数字分别代表大调、小调和补丁。在 Wikipedia page

上了解更多信息

Alpha 版本标有数字,并用下划线与其余数字隔开,例如:5.8.32_01

perl 提倡的要求是:

  1. “始终使用带(至少)三个分量的点分十进制”

  2. “始终使用前导-v”

  3. “始终引用版本”

因此,在 perl 模块中声明版本时,可以简单地使用以下内容:

package MyModule;
BEGIN
{
    use strict;
    use warnings;
    our $VERSION = 'v1.2.3';
};

# some code here
1;

__END__

在使用模块时,按照 the perl documentation,可以这样写:

use Module 12.34;

相当于:

BEGIN { require Module; Module->VERSION(12.34) }