如何将CPAN用作非root用户?

时间:2010-06-05 12:20:57

标签: perl cpan

我想在没有root访问权限的共享服务器上安装perl模块。我怎样才能做到这一点?它们似乎也有旧版本的CPAN(它在运行命令时会抱怨),是否可以更新我帐户中使用的CPAN命令而无需root权限?

5 个答案:

答案 0 :(得分:129)

到目前为止我发现的最简单的方法是说

wget -O- http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`
echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile
echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile

这假定您的个人资料名为.profile,您可能需要将其更改为.bash_profile.bashrc等。之后您可以通过说

来安装模块
cpanm Module::Name

只需使用它们,就像在根目录中安装它们一样。


以下是对上述命令的简要说明。

wget -O- http://cpanmin.us获取最新版本的cpanm并将其打印到STDOUT,然后通过管道传送到perl - -l ~/perl5 App::cpanminus local::lib。第一个-告诉perl期望该计划进入STDIN,这会使perl运行我们刚刚下载的cpanm版本。 perl将其余参数传递给cpanm-l ~/perl5参数告诉cpanm安装Perl模块的位置,另外两个参数是要安装的两个模块。 [App::cpanmins] 1是安装cpanm的软件包。 local::lib是一个帮助程序模块,用于管理在本地目录中运行模块所需的环境变量。

安装完这些模块后,我们运行

eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`

设置使用本地模块所需的环境变量,然后

echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile

确保我们下次登录时能够使用它们。

echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile

希望能让人找到你本地模块的手册页。

答案 1 :(得分:11)

http://web.archive.org/web/20120427144232/http://perl.jonallen.info/writing/articles/install-perl-modules-without-root

http://novosial.org/perl/life-with-cpan/non-root/

两套说明中的主要步骤涉及local::lib module

AFAIK,CPAN逻辑包含在Perl模块(CPAN.pm)中,这意味着您也可以像在任何其他Perl模块中一样轻松地在本地目录中安装较新的模块。


此外,一旦您在非标准位置安装模块,请查看从非标准位置加载库的这两个问题(上面的链接中已经提供了一些信息):

How does a Perl program know where to find the file containing Perl module it uses?

How is Perl’s @INC constructed?(又有什么方法可以影响搜索Perl模块的位置?)

答案 2 :(得分:5)

为了完整起见,如果您想将cpanm置于perl5之下,这是OSX上~/Library的安装过程。

curl -L http://cpanmin.us | perl - -l ~/Library/perl5 App::cpanminus local::lib
eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`
echo 'eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`' >> ~/.bash_profile

答案 3 :(得分:2)

如果您还希望能够阅读cpanminus安装模块的手册页,还应确保所选库路径的正确子目录位于MANPATH中。因此,上面显示cpanm安装过程的解决方案需要以下附加命令:

 export MANPATH=$HOME/Library/perl5/man:$MANPATH' >> ~/.bash_profile

答案 4 :(得分:-1)

实际上只是上面答案的复制粘贴,但是在单个可重复使用的bash脚本中:

 #! /usr/bin/env bash                                                                                                                                                     │··  
                                                                                                                                                                           │··
  # a bash wrapper for check-installing required perl modules as non-root  
main(){                                                                                                                                                                  │··
     doSetVars                                                                                                                                                             │··
     doCheckInstallPreReqs                                                                                                                                                 │··
     perl $PRODUCT_INSTANCE_DIR/src/perl/my-perl-script.t                                                                                                                          │··
  }                                                                                                                                                                        │··
                                                                                                                                                                           │··
  doSetVars(){                                                                                                                                                             │··
     #set -x                                                                                                                                                               │··
     umask 022    ;                                                                                                                                                        │··
     set -u -o pipefail                                                                                                                                                    │··
     run_unit_bash_dir=$(perl -e 'use File::Basename; use Cwd "abs_path"; print dirname(abs_path(@ARGV[0]));' -- "$0")                                                     │··
     export PRODUCT_INSTANCE_DIR=$run_unit_bash_dir/../..                                                                                                                  │··
  }                                                                                                                                                                        │··
                                                                                                                                                                           │··
  doCheckInstallPreReqs(){                                                                                                                                                 │··
     eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`                                                                                                                         │··
     perl -e '                                                                                                                                                             │··
        use JSON ;                                                                                                                                                         │··
        use Data::Printer;                                                                                                                                                 │··
        use Test::Most ;                                                                                                                                                   │··
        use Test::Mojo;                                                                                                                                                    │··
        use Data::Printer ;                                                                                                                                                │··
        use FindBin;                                                                                                                                                       │··
        use JSON::Parse ;                                                                                                                                                  │··
        use IPC::System::Simple ;                                                                                                                                          │··
        use Mojolicious ;                                                                                                                                                  │··
     ' || {                                                                                                                                                                │··
           curl -L http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib                                                                                         │··
           eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`                                                                                                                   │··
           echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.bashrc                                                                                               │··
           cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)                                                                         │··
           export PERL_MM_USE_DEFAULT=1                                                                                                                                    │··
           cpanm JSON Data::Printer Test::Most Test::Mojo Data::Printer FindBin JSON::Parse \                                                                              │··
              IPC::System::Simple                                                                                                                                          │··
           sudo curl -L cpanmin.us | perl - Mojolicious                                                                                                                    │··
     }                                                                                                                                                                     │··
                                                                                                                                                                           │··
  }                                                                                                                                                                        │··
                                                                                                                                                                           │··
  main