15

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

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

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

请尊重:

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

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

方法一

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

方法二

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

方法三

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

方法四

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

方法五

package PackageName;
our $VERSION = 0.000_01;

方法6

package PackageName;
our $VERSION = 0.0.1;
4

3 回答 3

8

正确答案是,这样做:

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

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

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

编辑:

在阅读了daxim的答案并思考了一下之后,我不得不同意将版本号放在引号中。它不会以任何方式改变功能,但会减少0.00101被误认为的机会,而v0.1.1实际上它是 .v0.1.10并且更清楚地读作0.001010.

于 2013-07-12T13:50:45.770 回答
6

在#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分发 tarball 名称中出现丑陋的前缀。然而,使用模块来处理版本,例如比较它们,是一个好主意。

不要使用v-strings。他们了解甚少。

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

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

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

遵守

该方案与中列出的建议完全兼容

它与semver不兼容。

于 2013-07-12T16:14:40.903 回答
2

4. 好。使用版本将有更少的极端情况。
5. 好的。
6.(缩写v0.0.1)让我们避免使用 v-strings,好吗?

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

于 2013-07-12T13:32:21.447 回答