如何将CPAN用作非root用户?


80

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


Answers:


137

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

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是要安装的软件包cpanmlocal::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

希望可以使man找到您本地模块的手册页。


+1代表cpanminus ...从未使用过,因此感觉不建议使用,但到目前为止我还是很喜欢
DVK 2010年

7
这对我来说一直很好。请注意,首先删除〜/ .profile(或任何其他文件)中现有的PERL5LIB环境变量。否则,运行第一个命令时,local :: lib将无法安装。
Juan A. Navarro 2010年

@juannavar好点,我倾向于将其安装在新安装的计算机上,因此不会遇到这种情况。
Chas。Owens 2010年

使用wget代替curl的一个很好的例子-尽管很多系统都使用wget,但默认情况下它们并未附带curl,因此这对于没有root用户安装新软件包很有用。
AndrewPK

1
@HielkeWalinga子进程无法修改父进程的环境。为了解决这个问题,类似 perl -I ~/perl5/lib/perl5 -Mlocal::libssh-agent需要为父进程设置环境变量的命令会先打印出需要在父进程中运行的命令,然后再打印出来eval。您实际上并不需要eval它们。您可以说perl -I ~/perl5/lib/perl5 -Mlocal::lib > /tmp/commands; source /tmp/commands,但是eval方法更干净(没有要清理或意外覆盖的文件)。
Chas。欧文斯(Owens)

12

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模块

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


另外,将模块安装在非标准位置后,请检查有关从非标准位置加载库的以下两个问题(上面的链接中已经提供了一些信息):

Perl程序如何知道在哪里可以找到包含它使用的Perl模块的文件?

Perl的@INC如何构造?(又有什么方法可以影响搜索Perl模块的位置?)


披露-我撰写了与此答案相关的两个SO问题。
DVK 2010年

2
至少有四种不同的方法可以从CPAN安装模块:手动,CPAN模块(及其等效的命令行cpan),CPANPLUS模块(及其等效的命令行cpanp)以及最新的App :: cpanminus发行版installs cpanm。其中,我发现cpanm这是最容易安装和使用的。 cpan并且cpanp默认情况下已安装,但需要进行大量设置才能正常工作。
Chas。欧文斯(Owens)2010年

404:在此服务器上找不到请求的URL / writing / articles / install-perl-modules-without-root。
harschware,2015年

6

为了完整,这是在安装过程中cpanm对OSX,如果你想保持你的perl5~/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

2

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

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

0

在过去的6个月中,我们一直在20多个部署中使用 以下功能,成功地将aws自动部署到aws ...从主要配置中进行调用,如下所示,这基本上只是上述答案的复制粘贴,但是仅需一次可用的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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.