我认为最简单的方法就是重新测试可以重新测试的所有内容:从CPAN下载每个已安装的模块并执行其测试脚本.
有没有办法下载和重新测试?
如果没有办法,是否有任何帮助/ API,所以我可以实现这样的工具?
我基本上需要
解决方法
$cpan -l 2>/dev/null |tail -10 Test2::Event::Encoding 1.302073 Test2::Event::Bail 1.302073 Test2::Event::Exception 1.302073 Test2::Event::Subtest 1.302073 Test2::Event::Skip 1.302073 Test2::Event::Info 1.302073 Test2::Event::Diag 1.302073 Test2::Event::TAP::Version 1.302073 JSON::PP 2.27400_02 JSON::PP::Boolean undef
如此处所示,您将获得模块和版本号的列表.有时该工具在Meta中找不到版本,因此将返回版本号的undef. CPAN作者应该注意这些类型的错误,因为它们使得希望在不编译模块本身的情况下识别版本的工具变得更加困难.
获得模块和版本号后,您可以使用cpanm工具(由App :: cpanm提供)及其–test-only选项来下载特定版本的模块并对其进行测试.您可以请求这样的特定版本:
cpanm Some::Module@0.9990
(仅下拉目标模块的0.9990版本).
事情变得棘手的是:Perl附带了一堆模块,其中一些还通过CPAN接收更新. cpan -l工具将列出所有已安装的模块,包括Perl附带的模块.
此外,列出的一些模块只是更大分布的一部分.
另一个对你有用的工具是核心列表,它自5.8.9以来与Perl捆绑在一起.如果你运行这个:
corelist File::Temp
你会得到:“File :: Temp最初是用perl v5.6.1发布的”
如果你这样做:
corelist JSON
你会得到:“JSON不在CORE中(或者我认为)”
因此,确定列表中正在查看的模块是否与Perl一起提供的模块非常简单.根据需要使用该信息.
您需要解决的另一件事是如何处理共享依赖项.如果您测试的第一件事是Moose升级,那么您将获得一半的CPAN(这是夸大其词),这会污染您的环境以测试其他模块.为了减轻这种影响,您有几个选择.一个是利用App :: perlbrew及其lib选项来设置一次性库空间.这样,您可以在perlbrew lib和perlbrew use指定的目标中安装模块及其依赖项,然后在完成后将其丢弃以转移到下一个库进行测试.
但是,可能有一个更好的解决方案,我不熟悉这里的文档:CPAN烟雾测试仪使用的工具链.如果您希望采用此策略,请参阅CPAN::Testers.烟雾测试人员已经制定了相对轻量级的方法,以自动方式下拉和测试模块及其依赖关系.
最后,您将遇到的另一个问题是CPAN作者决定哪些版本的模块存在于CPAN上以及哪些版本被删除.几年前,CPAN的作者被鼓励通过删除旧版本来保持他们的CPAN存储库清洁.我不知道这种做法是否仍然受到鼓励,但它确实意味着你不能指望仍然存在的特定版本号.要解决此问题,您应该为您在给定时刻安装的所有版本维护自己的tar包存储库. CPAN模块框架Pinto有助于保持模块的版本,固定一些不更新,以及其他有用的技巧.