如何将CPAN模块安装到本地目录?

69

我正在使用托管的Linux机器,因此我没有写入/usr/lib目录的权限。

当我尝试通过通常的方式安装CPAN模块时:

perl Makefile.PL
make test
make install

那个模块被提取到了一个 blib/lib/ 文件夹中。我保留了use blib/lib/ModuleName,但编译器仍然提示找不到模块。我尝试将 .pm 文件复制到本地目录并使用 require ModuleName,但仍然出现一些错误。

我怎样才能将一个模块安装到另一个目录并使用它?


2
通常情况下,您应该提供错误信息。"一些错误"并没有什么帮助。 - jrockway
重要提示:一些模块使用 Build.PL 而不是 Makefile.PL(或者将其包装在其中一个中),在某些情况下(例如测试运行时),从/到路径中带有空格的安装会混淆 MANIFEST 并导致测试失败,通常只有在设置 RELEASE_TESTING 时才会发生这种情况,请确保它未在您的计算机上启用。如果出现此类 MANIFEST 错误,则可能还存在其他错误,请使用没有空格(空格、制表符、unispace 等)的路径。 - osirisgothra
5个回答

71

以下是在Stackoverflow上已经有的其他答案:

来自perlfaq8:


我该如何保留自己的模块库目录?

当构建模块时,告诉Perl在哪里安装这些模块。

对于基于Makefile.PL的分发包,在生成Makefile时使用INSTALL_BASE选项:

perl Makefile.PL INSTALL_BASE=/mydir/perl

当您使用CPAN.pm shell时,您可以在CPAN.pm配置中设置此选项,以使模块自动安装到您的私有库目录中:

% cpan
cpan> o conf makepl_arg INSTALL_BASE=/mydir/perl
cpan> o conf commit

对于基于 Build.PL 的发行版,使用 --install_base 选项:

perl Build.PL --install_base /mydir/perl

你可以配置CPAN.pm以自动使用此选项:

% cpan
cpan> o conf mbuildpl_arg '--install_base /mydir/perl'
cpan> o conf commit

1
我认为你应该添加引号:o conf mbuild_arg '--install_base /mydir/perl' - Amro
Brian,一个问题 - 你提供的链接说 --install_base 参数被传递给了 perl Build.PL;但是 mbuild_arg 是关于 ./Build 的参数。也许你的意思是 mbuildpl_arg?或者是 perlfaq 中有错误? - skaurus
我不再维护perlfaq,所以你需要通过现有的任何流程来打补丁。不过看起来你是正确的。 - brian d foy
很遗憾,我甚至无法启动cpan - mkdir /scr/root/cpan:权限被拒绝。 - dbn
如何使用 cpan 选项执行相同操作? - Eugen Konkov
显示剩余2条评论

45

我遇到了类似的问题,甚至无法安装local::lib。

我创建了一个安装程序,在相对于.pl文件的某个位置安装了该模块。

安装过程如下:

perl Makefile.PL PREFIX=./modulos
make
make install

然后,在需要该模块的位于./目录中的.pl文件中进行调用。

use lib qw(./modulos/share/perl/5.8.8/); # You may need to change this path
use module::name;

其他文件(makefile.pl、module.pm等)不需要更改。

您只需调用 .pl 文件即可。

perl file.pl

13
无需修改您的脚本 -- 使用set PERL5LIB而不是use lib。 local::lib会为您处理这一点--按照其说明操作即可,您应该没问题。 - jrockway
11
使用INSTALL_BASE代替PREFIX。 - brian d foy
perl Makefile.PL INSTALL_BASE=/home/irraju/PadWalker 给了我这个错误:“'INSTALL_BASE'不是已知的MakeMaker参数名称。”即使PREFIX选项也给了我相同的错误。 - Ram
1
可以将INSTALL_BASE传递到Makefile.PL中以更改模块的安装位置。 INSTALL_BASE更像是大家所称的“前缀”,而不是PREFIX。——http://perldoc.perl.org/ExtUtils/MakeMaker.html#INSTALL_BASE - Lee Goddard
3
Perl v5.8.8不支持INSTALL_BASE参数(http://perldoc.perl.org/5.8.8/ExtUtils/MakeMaker.html),但在v5.8.9中加入了该参数(http://perldoc.perl.org/5.8.9/ExtUtils/MakeMaker.html)。 - David I.

20

local::lib可以帮助你。它将使“make install”(和“Build install”)安装到一个你可以写入的目录,并告诉perl如何访问这些模块。

一般来说,如果你想使用在blib/目录中的模块,你需要使用perl -Mblib...命令,其中...是你通常调用脚本的方式。


1
我非常推荐你使用 local::lib。它会处理所有细节。 - melo
很不幸,当我尝试安装它时,它未能通过“make test”。 - reinierpost

3
我强烈推荐Perlbrew。它允许您运行多个Perl版本,安装包,如果需要,可以修改Perl内部,所有这些都在正常用户权限下完成。

链接失效了吗? - ceving

3
对于基于Makefile.PL的发行版,在生成Makefile时,请使用INSTALL_BASE选项:
perl Makefile.PL INSTALL_BASE=/mydir/perl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接