루트가 아닌 사용자로 CPAN을 어떻게 사용할 수 있습니까?


81

루트 액세스 권한이없는 공유 서버에 Perl 모듈을 설치하고 싶습니다. 어떻게 할 수 있습니까? 그들은 또한 이전 버전의 CPAN을 가지고있는 것 같습니다 (명령을 실행할 때 불만이 있습니다), 루트 액세스없이 내 계정에서 사용중인 CPAN 명령을 업데이트 할 수 있습니까?


답변:


139

지금까지 찾은 가장 쉬운 방법은

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

사람이 로컬 모듈에 대한 매뉴얼 페이지를 찾도록 할 것입니다.


+1 for cpanminus ... 한 번도 사용하지 않았으므로 추천해야 할 것 같지 않지만 지금까지 본 것에서 마음에
듭니다

7
이것은 나를 위해 훌륭하게 작동했습니다. ~ / .profile (또는 기타)에 이미있는 기존 PERL5LIB 환경 변수를 먼저 제거하는 작은 메모입니다. 그렇지 않으면 첫 번째 명령을 실행할 때 local :: lib 설치에 실패합니다.
Juan A. Navarro

@juannavar 좋은 지적, 새로 설치된 컴퓨터에 설치하는 경향이 있으므로 그 경우에 부딪히지 않습니다.
Chas. 오웬

curl 대신 wget을 사용하는 좋은 예-많은 시스템은 wget을 수행하지만 기본적으로 curl이 제공되지 않으므로 루트가없는 사용자가 새 패키지를 설치하는 데 도움이됩니다.
AndrewPK

1
@HielkeWalinga 자식 프로세스는 부모 프로세스의 환경을 수정할 수 없습니다. 이 처리하려면, 같은 명령 perl -I ~/perl5/lib/perl5 -Mlocal::lib또는 ssh-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 모듈이 검색되는 위치에 영향을 미치는 모든 방법은 무엇입니까?)


공개-나는이 답변에 연결된 두 가지 질문을 모두 작성했습니다.
DVK 2010-06-05

2
CPAN에서 모듈을 설치하는 방법에는 수동, CPAN 모듈 (및 이에 상응하는 명령 줄 cpan), CPANPLUS모듈 (및 이에 상응하는 명령 줄 cpanp), .NET을 설치하는 새로운 App :: cpanminus 배포의 네 가지 이상의 다른 방법이 cpanm있습니다. 이 중에서 cpanm가장 쉽게 설치하고 사용하는 방법이 있습니다. cpan그리고 cpanp기본적으로 설치하지만, 제대로 작동하려면 중요한 설정이 필요합니다.
Chas. 오웬

404 : 요청 된 URL / writing / articles / install-perl-modules-without-root를이 서버에서 찾을 수 없습니다.
Harschware

6

완전성을 위해 이것은 cpanmOSX 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

우리는 사용하고 있습니다 다음 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.