4

我正在尝试部署到 dotcloud。我的 Makefile.PL 指出我需要 URI 1.60。development.yml 文件也这么说。构建器声称已安装该模块。

18:38:39: [www] I am snapshotsworker_02/bob-3, and I will be your builder today.
18:38:55: [www] URI is up to date. (1.60)

如果我跑

dotcloud run www -- perl -MURI -e '1'

它失败了

Can't locate URI.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .).
BEGIN failed--compilation aborted.

这可能是正确的,因为通常模块安装在 ~/perl5 下。所以,我尝试了:

$ dotcloud run www -- perl -I /home/dotcloud/perl5/lib/perl5 -MURI -e '1'
==> Executing "perl -I /home/dotcloud/perl5/lib/perl5 -MURI -e 1" on service (www) instance #0 (application XXXX)
Can't locate URI.pm in @INC (@INC contains: /home/dotcloud/perl5/lib/perl5 /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .).
BEGIN failed--compilation aborted.

同样奇怪的是 cpanm 不可用,尽管文档说我们可以使用它:

$ dotcloud run www -- cpanm URI
==> Executing "cpanm URI" on service (www) instance #0 (application XXXX)
bash: cpanm: command not found

有什么提示吗?

编辑:这似乎不是这个模块的问题。LWP 也有同样的情况。然后,更奇怪的是,HTTP::Date 依赖于 LWP。某些模块依赖项无法正常工作。旧版本的 dotcloud 客户端我从来没有遇到过这个问题。

谢谢你,阿尔贝托

4

1 回答 1

2

这种行为的原因很简单,但也很愚蠢。在这里,dotcloud 的人可能更专业,并且可以更好地配置 Perl 堆栈。

因此,在我的 dotcloud.yaml 文件中,我请求安装 perl 5.14.x。这是通过在 /opt/perl5/perls/current 中添加一个指向我想要的版本的符号链接来完成的(在我的例子中,/opt/perl5/perls/perl5.14.x/)。对于 Perl Web 堆栈,环境设置为首先搜索此 perl。

当我通过 cron 作业或通过 dotcloud 客户端的运行选项运行 perl 时,回答的 perl 是系统中的 perl (/usr/bin/perl),即 perl 版本 5.10.x。因此,在 perl 5.14.x 版本中安装的系统范围内的模块不可用(当我强制它们安装到 perl5 主目录时,它们对两个版本都可用)。

解决办法是用正确的路径调用 perl 二进制文件,或者为标准 shell 环境(这似乎与 web 环境不同)正确配置 PATH 环境变量。

如果 dotcloud 的人让这更透明,那就太好了。一种选择是记录这个问题,另一种选择是将 shell 环境设置为使用与 web 环境相同的 perl。这不应该那么难。

阿尔贝托

于 2012-11-24T20:20:32.297 回答