在Perl中声明包版本方法的优缺点是什么?

时间:2013-07-12 13:23:42

标签: perl versioning timtowtdi

模块很酷,特别是当它们带有版本控制时。您可以定义最小模块版本以防止要使用的方法泄漏。但是每个光线都有一个黑暗的一面,这意味着Perl的TIMTOWTDI。

作为Perl开发人员近七年后,我看到并以多种方式编写了版本声明。有些很容易被指出为坏,有些则不然。由于没有人能完全了解某种语言,所以我想问问你们,Perl中以下软件版本的优缺点是什么。

如果您发现一个泄漏,请不要犹豫,评论更多版本定义方式;)

请尊重:

  • 奇怪的需要/使用可能导致故障检测模块版本(编译与运行时)的模块
  • PAUSE / CPAN解析(和其他常见服务)
  • 最终用户的可读性
  • 开发人员的可维护性

在Perl中声明包版本方法的优缺点是什么?

方法1

package PackageName;
BEGIN {
  use version 0.77; our $VERSION = version->new('v0.0_1');
}

方法2

package PackageName;
BEGIN {
  our $VERSION = 0.000_01;
}

方法3

package PackageName;
BEGIN {
  our $VERSION = 0.0.1;
}

方法4

package PackageName;
use version 0.77; our $VERSION = version->new('v0.0_1');

方法5

package PackageName;
our $VERSION = 0.000_01;

方法6

package PackageName;
our $VERSION = 0.0.1;

3 个答案:

答案 0 :(得分:8)

正确的答案是,这样做:

package My::Thing;
our $VERSION = "0.001";

版本应始终为十进制数,使用三位数拆分约定。以上版本将缩短为v0.1.0,以更改缩写形式的第3步,您将定义您的版本:0.001001,这将是v0.1.1缩写。

请勿在您的版本号中添加下划线以标记dev版本。 Perl工具链后来采用了-TRIAL机制,例如Dist::Zilla 4.101800-TRIAL。这样做的好处是代码中的版本号不需要更改。通过添加-TRIAL,仅从规范中修改发布文件名和元文件。

修改

在阅读了daxim的回答并稍微思考之后,我必须同意将版本号放在引号中。它不会以任何方式更改功能,但会降低0.00101被误认为v0.1.1的可能性,当它实际上是v0.1.10时更明显地被视为0.001010

答案 1 :(得分:5)

according to me和各种#toolchain潜伏多年之后的最佳做法module-related mailing lists

实施例

对于模块:

package Foo::Bar 2.001; # 2nd version of revision 2
package Fnord 2.420;    # 421st version of revision 2

否则:

our $VERSION = '2.001'; # 2nd version of revision 2
our $VERSION = '2.420'; # 421st version of revision 2

每个模块都必须有一个版本,否则在分割分发时准确指定依赖关系会有问题。当分发版本和每个模块的版本相同并且在锁定步骤中增加时,它最有效。为了简化这一过程,请使用perl-reversion,这是Perl::Version的一部分。每当您需要依赖分发外部代码的新功能或更改的API时,请增加版本。

使用package声明时,版本是有理数。如果package声明不合适,请声明魔术$VERSION变量,然后版本为字符串。

在任何情况下,版本都包含修订号,作为分隔符的文字点和版本号,共有y.xxx形式。 y是一个自然数,xxx正好是三个零填充数字。字符串引用可防止尾随零消失。填充到相同数量的数字可防止混淆1.10 < 1.9。只有一个分隔符可以防止混淆5.10.1 == 5.010001

请勿使用version模块声明版本。使用普通字符串可以防止分发tarball名称中出现丑陋的v前缀。但是,使用该模块来处理版本,例如比较它们,是个好主意。

请勿使用v-strings。他们很难理解。

不要使用下划线。使用下划线需要eval版本将其转换为数字。如果要将分发标记为PAUSE索引器的候选发布版add the word TRIAL to the distribution name

只能通过通用VERSION类方法访问版本。

perl -mLWP::Simple -E'say LWP::Simple->VERSION'

遵守

该方案与

中提出的建议完全一致

semver不兼容。

答案 2 :(得分:2)

4。好。使用版本将减少角落情况。
5。好。
6。 (v0.0.1的缩写)请避免使用v字符串吗?

BEGIN确实有所作为(在编译以下行之前填充$VERSION),但这种差异是无用的。