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

Posted

技术标签:

【中文标题】如何以非 root 用户身份使用 CPAN?【英文标题】:How can I use CPAN as a non-root user? 【发布时间】:2011-02-28 03:32:03 【问题描述】:

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

【问题讨论】:

How can I use a new Perl module without install permissions? 的可能重复项 【参考方案1】:

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

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

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

【讨论】:

cpanminus 的 +1... 从未使用过它,所以我觉得我不应该推荐它,但我喜欢它,从我目前看到的 SO 来看 这对我来说效果很好。只需一个小提示,首先删除您的 ~/.profile(或其他)中已经存在的任何现有 PERL5LIB 环境变量。否则 local::lib 在运行第一个命令时将无法安装。 @juannavar 好点,我倾向于将它安装在新安装的机器上,所以我不会遇到这种情况。 使用 wget 代替 curl 的好例子 - 许多系统默认不附带 curl,尽管它们使用 wget,所以这对于没有 root 的人安装新包很有帮助。 @HielkeWalinga 子进程不能修改父进程的环境。为了解决这个问题,需要为父进程设置环境变量的命令如perl -I ~/perl5/lib/perl5 -Mlocal::libssh-agent 会打印出需要在父进程中运行的命令,然后eval 它们。不过,您实际上并不需要eval 他们。你可以说perl -I ~/perl5/lib/perl5 -Mlocal::lib > /tmp/commands; source /tmp/commands,但 eval 方法更干净(没有文件需要清理或意外覆盖)。【参考方案2】:

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 模块搜索位置的所有方式有哪些?)

【讨论】:

披露 - 我编写了此答案中链接的两个 SO 问题。 至少有四种不同的方式从 CPAN 安装模块:手动、CPAN 模块(及其命令行等效项cpan)、CPANPLUS 模块(及其命令行等效项cpanp ),以及安装 cpanm 的新 App::cpanminus 发行版。其中,我发现cpanm 是最容易安装和使用的。 cpancpanp 默认安装,但需要大量设置才能正常工作。 404:在此服务器上找不到请求的 URL /writing/articles/install-perl-modules-without-root。【参考方案3】:

为了完整起见,如果您想将perl5 保留在~/Library 下,这是cpanm 在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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

在过去的 6 个月中,我们一直在使用 the following func 进行 20 多次部署,成功地自动部署到 aws ...从主要配置 as follows 调用,这基本上只是上述答案的复制粘贴,但在一个可重复使用的 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

【讨论】:

以上是关于如何以非 root 用户身份使用 CPAN?的主要内容,如果未能解决你的问题,请参考以下文章