我可以重新测试所有已安装的CPAN模块吗?

npo*_*cop 8 perl cpan software-update dependency-management

如果模块A依赖于模块B并且模块B已升级,则A可能因更改而中断.我的想法是重新测试两者AB升级后B.

我认为最简单的方法就是重新测试可以重新测试的所有内容:从CPAN下载每个已安装的模块并执行其测试脚本.

有没有办法下载和重新测试?

如果没有办法,是否有任何助手/ API,所以我可以实现这样的工具?

我基本上需要

  • 查询安装的内容(包括版本号)
  • 下载并解压缩确切版本
  • 执行测试

Dav*_*idO 4

cpan核心 Perl 附带的工具包含一个选项-l,指示它提供已安装模块的列表。例如,我的系统上列表中的最后 10 项:

$ 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
Run Code Online (Sandbox Code Playgroud)

如此处所示,您将获得模块和版本号的列表。有时该工具在 META 中找不到版本,因此将返回undef版本号。CPAN 作者应该留意此类错误,因为它们使那些希望在不编译模块本身的情况下识别版本的工具变得更加困难。

获得模块和版本号后,您可以使用该cpanm工具(由 App::cpanm 提供)及其--test-only选项来拉取特定版本的模块并进行测试。您可以像这样请求特定版本:

cpanm Some::Module@0.9990
Run Code Online (Sandbox Code Playgroud)

(仅下载目标模块的版本 0.9990)。

事情变得棘手的地方如下:Perl 附带了一堆模块,其中一些还通过 CPAN 接收更新。该cpan -l工具将列出所有已安装的模块,包括 Perl 附带的模块。

此外,列出的一些模块只是更大发行版的一部分。

另一个对您有用的工具是 ,它从 5.8.9 起就与 Perl 捆绑在一起corelist。如果你运行这个:

corelist File::Temp
Run Code Online (Sandbox Code Playgroud)

你会得到: ” File::Temp was first released with perl v5.6.1

如果你这样做:

corelist JSON
Run Code Online (Sandbox Code Playgroud)

你会得到: ” JSON was not in CORE (or so I think)

因此,确定您在列表中查看的模块是否是 Perl 附带的模块非常简单。根据您的需要使用该信息。

您必须解决的另一件事是如何处理共享依赖项。如果您测试的第一件事是 Moose 升级,那么您将拉入一半的 CPAN(这是夸张的),这会弄脏您测试其他模块的环境。为了减轻这种影响,您有几种选择。一是利用App::perlbrewlib设置一次性图书馆空间的选项。这样,您可以在perlbrew lib和指定的目标中安装模块及其依赖项perlbrew use,然后在完成后将其丢弃,以继续到下一个库进行测试。

然而,可能有更好的解决方案,我对此不太熟悉,无法在此处记录:CPAN 烟雾测试人员使用的工具链。如果您希望采用此策略,请参阅CPAN::Testers 。冒烟测试人员已经制定了相对轻量级的方法,以自动化的方式下拉和测试模块及其依赖项。

最后,您将遇到的另一个问题是 CPAN 作者决定其模块的哪些版本存在于 CPAN 上以及哪些版本被删除。几年前,CPAN 作者被鼓励通过删除旧版本来保持其 CPAN 存储库的清洁。我不知道是否仍然鼓励这种做法,但这确实意味着您不能指望仍然存在的特定版本号。为了解决这个问题,您可能应该为在给定时刻安装的所有版本维护自己的 tarball 存储库。CPAN 模块框架Pinto有助于保留模块的版本、固定某些模块不更新以及其他有用的技巧。