我想在没有root访问权限的共享服务器上安装perl模块。我怎样才能做到这一点?他们似乎还具有较旧的CPAN版本(运行该命令时会抱怨),是否可以从我的帐户更新正在使用的CPAN命令而无需root访问权限?
Answers:
到目前为止,我发现的最简单的方法是说
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找到您本地模块的手册页。
perl -I ~/perl5/lib/perl5 -Mlocal::lib
或ssh-agent
需要为父进程设置环境变量的命令会先打印出需要在父进程中运行的命令,然后再打印出来eval
。您实际上并不需要eval
它们。您可以说perl -I ~/perl5/lib/perl5 -Mlocal::lib > /tmp/commands; source /tmp/commands
,但是eval方法更干净(没有要清理或意外覆盖的文件)。
http://novosial.org/perl/life-with-cpan/non-root/
两组指令中的主要步骤都涉及local :: lib模块
AFAIK,CPAN逻辑包含在Perl模块(CPAN.pm)中,这意味着您可以像在任何其他Perl模块中一样轻松地在本地目录中安装较新的版本。
另外,将模块安装在非标准位置后,请检查有关从非标准位置加载库的以下两个问题(上面的链接中已经提供了一些信息):
Perl程序如何知道在哪里可以找到包含它使用的Perl模块的文件?
Perl的@INC如何构造?(又有什么方法可以影响搜索Perl模块的位置?)
cpan
),CPANPLUS
模块(及其等效的命令行cpanp
)以及最新的App :: cpanminus发行版installs cpanm
。其中,我发现cpanm
这是最容易安装和使用的。 cpan
并且cpanp
默认情况下已安装,但需要进行大量设置才能正常工作。
为了完整,这是在安装过程中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
在过去的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