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



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

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

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

请尊重:

  • 奇怪的要求/使用模块可能会导致检测模块版本时出现问题(编译与运行时(
  • 暂停/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;

正确答案是,这样做:

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

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

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

编辑:

看完大仙的回答,琢磨了一下,我不得不同意把版本号放在引号里。它不会以任何方式更改功能,但减少了0.00101被误认为v0.1.1的机会,而实际上它是v0.1.10的并且更清楚地读作0.001010

根据我在 #toolchain 和各种与模块相关的邮件列表中潜伏多年的最佳实践。

例子

对于模块:

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 .

不要使用版本模块来声明版本。使用纯字符串可以防止发行版压缩包名称中出现丑陋的v前缀。但是,使用模块来处理版本,例如用于比较它们,是一个好主意。

不要使用v字符串。人们对它们知之甚少。

不要使用下划线。使用下划线需要评估版本以将其转换为数字。如果要将分发标记为 PAUSE 索引器的候选版本,请将单词 TRIAL 添加到分发名称中。

应仅通过通用VERSION类方法访问版本。

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

合规

该方案与

  • 珀尔莫德风格
  • 版本
  • "严格"版本规则
  • "版本号应该很无聊">
  • Perl::Critic::P olicy::ValuesAndExpressions::P rohibitVersionString
  • Perl::Critic::P olicy::ValuesAndExpressions::RequireNumericVersion

它与森弗不兼容。

4.好。使用版本将具有较少的极端情况。
5. 好的。
6.(v0.0.1的简称(让我们避免使用V型字符串,好吗?

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

最新更新