2

我尝试从Module::Starter基础为自制模块构建Perl 发行版。 我的机器上的每个测试都通过了,但是当我将它上传到 CPAN 以从 cpantesters.org获得一些更通用的测试时,一些测试在其他架构或操作系统上失败了,但我不明白为什么。我可以在测试报告中看到我的一些先决条件在测试之前没有安装,但我希望它。

我试图将这些依赖项列在Makefile.PL PREREQ_PMhash 中,然后在TEST_REQUIREShash中,但它并没有改变很多结果。

然后,当我从本地机器中删除依赖项并尝试使用 安装我的模块Cpanm时,它首先下载依赖项,测试通过并且安装成功。

这是我第一次尝试模块,所以我想我错过了一些东西,也许我太习惯了Cpanm魔法。谢谢你的帮助。

4

1 回答 1

2

问题是不同的。Andreas 的吸烟者很可能App::Ack成功地建立了依赖关系(在失败报告中看起来就像不存在一样)。但这里至少有两个问题:

  • 当一个发行版被测试时,它的依赖可能已经安装了,也可能没有安装。PERL5LIB但是,通过环境变量可以保证所有依赖模块都可用,因此make test通常可以工作(更具体地说,如果install Module在 CPAN shell 中使用该命令,则立即安装所有依赖项。如果test Module使用该命令,则依赖项仅构建,但未安装。CPAN 用户可以稍后使用install_tested) 进行安装。所以可能是这里App::Ack没有安装,只是建了. 特别是这意味着ack脚本没有安装在最终位置。
  • 即使安装了它,许多冒烟测试人员或并行安装了多个 perl 的用户使用这个 perl 的非标准目录。所以ack不会安装在/usr/binor/usr/local/bin中,而是安装在这个 perl 的 bin 目录中。这个目录可能在也可能不在用户的目录PATH中。所以你不能假设这can_run("ack")在这里有效。这里的解决方法是$Config{scriptdir}临时添加到$ENV{PATH}. 如果可能的话,另一个解决方案是使用 App 模块而不是脚本。不幸的是,它看起来ack只能作为脚本调用。

如果您查看示例失败报告,那么您可以看到App::Ack已安装(它出现在要求和 build_requires 下的 PREREQUISITES 部分中,您还可以App::Ack在“HAVE”列中查看安装了哪个版本)。您还可以查看用户的PATH(在 ENVIRONMENT 部分中)。您可能会猜到这个 perl 的 scriptdir,它通常与安装 perl 二进制文件本身的目录相同,并且当前 perl 的路径可见$^X(在“Perl 特殊变量”下)。

如果你想重现这种行为,那么你需要ack从你的机器上卸载,使用 构建一个自定义的 perl ./configure.gnu --prefix=/path/to/custom/perl-5.X.Y,然后使用这个 perl 进行测试。

于 2013-09-17T19:27:04.027 回答