如果模块A
依赖于模块B
并且模块B
已升级,则A
可能会因更改而中断。我的想法是在升级B
后重新测试A
和B
。
我认为最简单的方法是重新测试所有可以重新测试的内容:从 CPAN 下载每个已安装的模块并执行其测试脚本。
有没有办法下载和重新测试?
如果没有办法,是否有任何帮助程序/API,以便我可以实现这样的工具?
我基本上需要
- 查询已安装的内容(包括版本号)
- 下载并解压缩确切版本
- 执行测试
核心Perl附带的cpan
工具包含一个-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
如此处所示,您将获得模块和版本号的列表。有时该工具在 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
. 如果运行以下命令:
corelist File::Temp
你会得到:"File::Temp was first released with perl v5.6.1
">
如果这样做:
corelist JSON
你会得到:"JSON was not in CORE (or so I think)
">
因此,确定您在列表中查看的模块是否是 Perl 附带的模块非常简单。 根据需要使用该信息。
您必须解决的另一件事是如何处理共享依赖项。 如果你测试的第一件事是 Moose 升级,你会拉进一半的 CPAN(这有点夸张),这会弄脏你的环境来测试其他模块。 为了减轻这种影响,您有几种选择。一种是利用App::perlbrew
及其lib
选项来设置一次性图书馆空间。 这样,您可以将模块及其依赖项安装在perlbrew lib
和perlbrew use
指定的目标中,然后在完成后将其丢弃以转到下一个库进行测试。
但是,可能有一个更好的解决方案,我在这里不太熟悉:CPAN 烟雾测试仪使用的工具链。 请参阅 CPAN::测试人员 如果您希望采用此策略。烟雾测试仪已经制定了相对轻量级的方法,以自动化的方式下拉和测试模块及其依赖项。
最后,您将遇到的另一个问题是,CPAN 作者是决定其模块的哪些版本存在于 CPAN 上以及哪些版本被删除的人。 几年前,CPAN作者被鼓励通过删除旧版本来保持他们的CPAN存储库干净。我不知道这种做法是否仍然受到鼓励,但这确实意味着您不能指望仍然存在的特定版本号。 要解决此问题,您可能应该为给定时间安装的所有版本维护自己的压缩包存储库。 CPAN 模块框架 Pinto 有助于保留模块的版本、固定一些模块以不更新以及其他有用的技巧。
如果您下载并提取发行版B
并cd
到该目录中,您可以使用我的 Test::BrewBuild 中的 brewbuild 二进制文件(注意:需要 Perlbrew 或 Berrybrew)和-R
又名--revdep
标志来测试B
以及所有需要B
的发行版:
~/repos/Mock-Sub $ brewbuild -R
reverse dependencies: Test::Module::CheckDep::Version, App::RPi::EnvUI, RPi::DigiPot::MCP4XXXX, Devel::Examine::Subs, PSGI::Hector, File::Edit::Portable, Devel::Trace::Subs
Test::Module::CheckDep::Version
5.26.1 :: PASS
App::RPi::EnvUI
5.26.1 :: FAIL
RPi::DigiPot::MCP4XXXX
5.26.1 :: FAIL
Devel::Examine::Subs
5.26.1 :: PASS
PSGI::Hector
5.26.1 :: PASS
File::Edit::Portable
5.26.1 :: PASS
Devel::Trace::Subs
5.26.1 :: PASS
每次更新具有反向依赖关系的 CPAN 发行版之一时,我都会这样做,因此我不会破坏我的 dist 的任何使用者。