模块很酷,尤其是当它们带有版本控制时。您可以定义最低模块版本,以防止泄漏要使用的方法。但是每一个光明的一面都有一个黑暗的一面,这意味着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
(,但这种区别是无用的。