如何成为CPAN贡献者 - 第2部分
在前一篇文章中,我描述了一些适合CPAN新手解决的问题。在这篇文章中,我将详细说明解决问题的方法,以及需要注意的一些陷阱。如果你不熟悉Perl分布、模块和包之间的区别,请查看这篇指南。
缺少许可元名称
这是构建脚本缺少许可名称的地方。这应该是一个简单的修复——只需将许可名称添加到构建脚本中。然而,有一个陷阱,我曾经就因此吃过亏:许可元名称取决于构建脚本类型。例如,如果分布文档在Makefile.PL中表示许可证是“Artistic 2”,则元名称将是“artistic_2”,而在dist.ini中则是“Artistic_2_0”。
例如,我的分布Map::Tube的Makefile.PL
...
ABSTRACT_FROM => 'lib/Map/Tube.pm',
LICENSE => 'artistic_2',
EXE_FILES => [ 'script/map-data-converter' ],
...
与我的分布Map::Tube::Delhi的dist.ini相比
...
author = Mohammad S Anwar <mohammad.anwar@yahoo.com>
license = Artistic_2_0
copyright_holder = Mohammad S Anwar
...
如果你要向分布添加软件许可证,Software::License是一个很好的资源,它包含许多不同类型的开源许可证。
需要检查的一件事是,分布存储库是否有META.yml文件。如果有,将许可元名称添加到构建脚本可能会导致构建过程警告:“无效的LICENSE值……”。这是因为META.yml已经包含了一个“未知”的许可证值,与构建脚本冲突。这里的解决方案是删除META.yml文件,构建分布,并将重新生成的META.yml文件添加回存储库。
你可能想知道,为什么你会在项目存储库中保留META.yml文件,因为它可以很容易地生成?我同意这很可能是错误,但请记住,你的目的是添加许可证元,而不是其他任何内容。作者可能保留META.yml文件有很好的理由。一种方法是与作者讨论是否完全删除它是好主意。
缺少strict/warnings祈使句
这是最简单的:分布中的一个或多个模块缺少[strict](https://metacpan.org/pod/strict)或warnings祈使句。只需在缺少它们的模块顶部添加一行use strict;
(或use warnings;
)即可
package package_name;
use strict;
这很简单吗?是的,也不是。如果模块使用Moose或Moo,则use strict;
会自动启用,因此额外的导入是多余的。模块Test::Strict有一个strict_ok
测试函数,可以检测模块是否启用了strict模式(完全坦白,我是该分布的维护者)。
对于warnings祈使句,还有其他考虑因素。我在2018年德国Perl研讨会上发表讲话,在讲话中我提到我的一个pull request因为添加了warnings祈使句而被作者拒绝。当时我没有勇气质疑作者,所以我道歉并继续前进。令人惊讶的是,那位作者就坐在前排参加我的演讲!他就是[Reini Urban]().演讲结束时,他向我解释了他拒绝pull request的原因:在某些情况下,添加warnings祈使句可能会降低Perl的执行速度。
所以这个故事的意义是,在添加use warnings;行时要小心。说实话,除非我认识作者,否则我会避免处理缺少warnings的问题。
缺少META.json
有时,您会发现某些发行版缺少META.json文件。最近,我发现许多CPAN模块作者已经采用了Dist::Zilla作为发行版构建工具。我对这个工具非常喜爱,然而,如果作者是从传统的发行版构建工具如ExtUtils::MakeMaker迁移过来,他们通常会忘记生成这个文件。
对于这个问题有一个简单的解决方案:只需将[MetaJSON]
添加到dist.ini文件中,Dist::Zilla将在构建过程中生成它。
缺少最小Perl版本
这就是构建脚本没有声明所需的最低Perl版本的地方。我现在将向您展示如何根据模块作者使用的发行版构建工具添加此信息。
在ExtUtils::MakeMaker的情况下,只需在Makefile.PL脚本中添加如下所示的MIN_PERL_VERSION
键即可。
use ExtUtils::MakeMaker;
WriteMakefile(
MIN_PERL_VERSION => 5.006,
...
);
而如果发行版构建工具是Module::Build,则可以这样做
use Module::Build;
my $builder = Module::Builder->new(
requires => {
'perl' => 5.006,
},
...
);
如果使用Dist::Zilla,则可以在dist.ini中显式设置最小Perl版本,如下所示
...
[Prereqs]
perl = 5.006
...
或者您可以使用插件MinimumPerlFast,它会检测发行版所需的最小Perl版本
...
[MinimumPerlFast]
...
如果您需要任何帮助以开始作为CPAN的贡献者,请随时通过电子邮件联系我,如果需要,我们可以远程结对编程以帮助您开始。
标签
穆罕默德·萨吉德·安瓦尔
穆罕默德是2022年白骆驼奖获得者,也是CPAN贡献者。他喜欢提交拉取请求和在Perl会议上发言。他运营每周挑战。他还是Perl Weekly通讯的共同编辑。更多关于他的信息请访问他的网站。
浏览他们的文章
反馈
这篇文章有什么问题吗?请在GitHub上打开一个问题或拉取请求以帮助我们。