如何以非 root 用户身份使用 CPAN?

问题描述 投票:0回答:5

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

perl cpan
5个回答
144
投票

您可以使用 cpanminuslocal::lib 模块。

迄今为止我发现的最简单的方法是:

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
    、cpa 并将其打印到
    STDOUT

  • 下载的脚本然后通过管道传输到

    perl - -l ~/perl5 App::cpanminus local::lib
    :第一个
    -
    告诉
    perl
    期望程序在
    STDIN
    上进入,这使得
    perl
    运行我们刚刚下载的
    cpanm
    版本;
    perl
    将其余参数传递给
    cpanm
    -l ~/perl5
    参数告诉
    cpanm
    在哪里安装 Perl 模块,另外两个参数是要安装的两个模块:

    • [App::cpanminus
      ]3是安装
      cpanm
      的软件包。此安装是 cpanminus 引导程序的方式:我们现在下载的脚本将自身安装为应用程序。
    • local::lib
      是一个辅助模块,用于管理在本地目录中运行模块所需的环境变量。
  • 现在安装已完成,我们运行:

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

    设置在此 shell 会话中使用本地模块所需的环境变量,并且

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

    确保我们在下一个登录 shell 会话中设置它们。

  • 最后,我们确保未来的登录 shell 会话将具有本地模块的手册帮助页面,可供

    man
    实用程序进行搜索,其中

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

    这有望导致

    man
    找到本地模块的手册页。


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

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


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

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

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


7
投票

为了完整起见,如果您想将

cpanm
保留在
perl5
下,这是
~/Library
在 OSX 上的安装过程。

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 ...从主配置中调用如下,这基本上只是上述答案的复制粘贴,但是在单个可重复使用的 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
© www.soinside.com 2019 - 2024. All rights reserved.