루트 액세스 권한이없는 공유 서버에 Perl 모듈을 설치하고 싶습니다. 어떻게 할 수 있습니까? 그들은 또한 이전 버전의 CPAN을 가지고있는 것 같습니다 (명령을 실행할 때 불만이 있습니다), 루트 액세스없이 내 계정에서 사용중인 CPAN 명령을 업데이트 할 수 있습니까?
루트 액세스 권한이없는 공유 서버에 Perl 모듈을 설치하고 싶습니다. 어떻게 할 수 있습니까? 그들은 또한 이전 버전의 CPAN을 가지고있는 것 같습니다 (명령을 실행할 때 불만이 있습니다), 루트 액세스없이 내 계정에서 사용중인 CPAN 명령을 업데이트 할 수 있습니까?
답변:
지금까지 찾은 가장 쉬운 방법은
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
펄 모듈을 설치하고 다른 두 개의 인수를 설치하는 두 개의 모듈이 위치를. [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
사람이 로컬 모듈에 대한 매뉴얼 페이지를 찾도록 할 것입니다.
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
), .NET을 설치하는 새로운 App :: cpanminus 배포의 네 가지 이상의 다른 방법이 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
우리는 사용하고 있습니다 다음 FUNC를 20 배포에 지난 6 개월 동안 주요 프로비저닝에서 호출 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