模块很酷,特别是当它们带有版本控制时。您可以定义最小模块版本以防止要使用的方法泄漏。但是每个光线都有一个黑暗的一面,这意味着Perl的TIMTOWTDI。
作为Perl开发人员近七年后,我看到并以多种方式编写了版本声明。有些很容易被指出为坏,有些则不然。由于没有人能完全了解某种语言,所以我想问问你们,Perl中以下软件版本的优缺点是什么。
如果您发现一个泄漏,请不要犹豫,评论更多版本定义方式;)
请尊重:
在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;
答案 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
),但这种差异是无用的。