Chcę zainstalować moduły Perla na serwerze współdzielonym, na którym nie mam uprawnień administratora. Jak mogę to zrobić? Wydaje się, że mają również starszą wersję CPAN (narzeka na to podczas uruchamiania polecenia), czy jest możliwe zaktualizowanie polecenia CPAN używanego z mojego konta bez konieczności dostępu do konta roota?
81
Odpowiedzi:
Najłatwiejsza metoda, jaką do tej pory znalazłem, to powiedzieć
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
Zakłada Twój profil jest nazwany
.profile
, może zaistnieć potrzeba zmiany, aby być.bash_profile
,.bashrc
itd Po tym można zainstalować moduły mówiąci po prostu użyj ich w taki sam sposób, jak gdybyś był zainstalowany w katalogach głównych.
Poniżej znajduje się krótkie wyjaśnienie, co robią powyższe polecenia.
wget -O- http://cpanmin.us
pobiera najnowszą wersję programucpanm
i drukuje ją, doSTDOUT
której jest następnie przesyłana potokiemperl - -l ~/perl5 App::cpanminus local::lib
. Pierwsza-
mówi,perl
że należy oczekiwać, że program się włączySTDIN
, co powoduje, żeperl
uruchomiona zostanie wersja,cpanm
którą właśnie pobraliśmy.perl
przekazuje pozostałe argumenty docpanm
.-l ~/perl5
Argumentem opowiadacpanm
gdzie zainstalować moduły Perl, a pozostałe dwa argumenty są dwa moduły do zainstalowania.[App::cpanmins
] 1 to pakiet, który jest instalowanycpanm
.local::lib
to moduł pomocniczy, który zarządza zmiennymi środowiskowymi potrzebnymi do uruchamiania modułów w katalogu lokalnym.Po zainstalowaniu tych modułów uruchamiamy
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`
aby ustawić zmienne środowiskowe potrzebne do korzystania z modułów lokalnych, a następnie
echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile
aby upewnić się, że będziemy mogli z nich korzystać przy następnym logowaniu.
echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile
miejmy nadzieję, że man znajdzie strony podręcznika dla twoich lokalnych modułów.
źródło
perl -I ~/perl5/lib/perl5 -Mlocal::lib
lub innessh-agent
muszą ustawić zmienne środowiskowe dla procesu nadrzędnego, wypisują polecenia, które muszą zostać uruchomione w procesie nadrzędnym, a następnieeval
je. W rzeczywistościeval
ich nie potrzebujesz . Można powiedziećperl -I ~/perl5/lib/perl5 -Mlocal::lib > /tmp/commands; source /tmp/commands
, że metoda eval jest czystsza (brak plików do wyczyszczenia lub przypadkowego nadpisania).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/
Główny krok w obu zestawach instrukcji dotyczy modułu local :: lib
AFAIK, logika CPAN jest zawarta w module Perla (CPAN.pm), co oznacza, że możesz łatwo zainstalować nowszą wersję w swoim lokalnym katalogu, tak jak w przypadku każdego innego modułu Perla.
Ponadto, po zainstalowaniu modułów w niestandardowej lokalizacji, sprawdź te dwa pytania dotyczące ładowania bibliotek z niestandardowych lokalizacji (niektóre informacje są już dostępne w powyższym linku):
Skąd program w Perlu wie, gdzie znaleźć plik zawierający używany przez niego moduł Perla?
Jak zbudowany jest @INC Perla? (aka Jakie są wszystkie sposoby wpływania na miejsce wyszukiwania modułów Perla?)
źródło
cpan
),CPANPLUS
moduł (i jego odpowiednik z linii poleceńcpanp
) oraz nowa dystrybucja App :: cpanminus, która instalujecpanm
. Spośród nich uważam, żecpanm
jest najłatwiejszy w instalacji i obsłudze.cpan
icpanp
są instalowane domyślnie, ale do poprawnego działania wymagają znacznej konfiguracji.Aby uzyskać kompletność, jest to proces instalacji
cpanm
na OSX, jeśli chcesz zachowaćperl5
poniżej~/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
źródło
Jeśli chcesz mieć możliwość czytania stron podręcznika systemowego dla modułów zainstalowanych w programie cpanminus, powinieneś również upewnić się, że poprawny podkatalog wybranej ścieżki biblioteki znajduje się w MANPATH. Zatem powyższe rozwiązanie pokazujące proces instalacji cpanm wymaga następującego dodatkowego polecenia:
export MANPATH=$HOME/Library/perl5/man:$MANPATH' >> ~/.bash_profile
źródło
używaliśmy następującej funkcji w ciągu ostatnich 6 miesięcy na ponad 20 wdrożeniach pomyślnych zautomatyzowanych wdrożeniach do aws ... wywołanych z głównego udostępniania w następujący sposób , co jest po prostu skopiowaniem wklejania powyższych odpowiedzi, ale w jednym ponownym użyteczny skrypt 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
źródło