Jak mogę używać CPAN jako użytkownik inny niż root?

81

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?

Juan A. Navarro
źródło

Odpowiedzi:

139

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, .bashrcitd Po tym można zainstalować moduły mówiąc

cpanm Module::Name

i 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.uspobiera najnowszą wersję programu cpanmi drukuje ją, do STDOUTktórej jest następnie przesyłana potokiem perl - -l ~/perl5 App::cpanminus local::lib. Pierwsza -mówi, perlże należy oczekiwać, że program się włączy STDIN, co powoduje, że perluruchomiona zostanie wersja, cpanmktórą właśnie pobraliśmy. perlprzekazuje pozostałe argumenty do cpanm. -l ~/perl5Argumentem opowiada cpanmgdzie zainstalować moduły Perl, a pozostałe dwa argumenty są dwa moduły do zainstalowania. [App::cpanmins] 1 to pakiet, który jest instalowany cpanm. local::libto 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.

Chas. Owens
źródło
+1 dla cpanminus ... nigdy go nie używałem, więc nie czuję się tak, jak powinienem go polecić, ale podoba mi się to z tego, co do tej pory widziałem na SO
DVK
7
U mnie to działa doskonale. Tylko mała uwaga, aby najpierw usunąć wszystkie istniejące zmienne środowiskowe PERL5LIB, które są już w twoim ~ / .profile (lub czymkolwiek). W przeciwnym razie instalacja local :: lib nie powiedzie się po uruchomieniu pierwszego polecenia.
Juan A. Navarro
@juannavar Dobra uwaga, mam tendencję do instalowania go na nowo zainstalowanych maszynach, więc nie napotykam tego przypadku.
Chas. Owens
Świetny przykład użycia wget zamiast curl - wiele systemów nie ma domyślnie curl, chociaż ma wget, więc jest to pomocne dla osób bez uprawnień roota, aby zainstalować nowe pakiety.
AndrewPK,
1
@HielkeWalinga Procesy potomne nie mogą modyfikować środowiska procesów nadrzędnych. Aby sobie z tym poradzić, polecenia takie jak perl -I ~/perl5/lib/perl5 -Mlocal::liblub inne ssh-agentmuszą ustawić zmienne środowiskowe dla procesu nadrzędnego, wypisują polecenia, które muszą zostać uruchomione w procesie nadrzędnym, a następnie evalje. W rzeczywistości evalich 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).
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/

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?)

DVK
źródło
Ujawnienie - jestem autorem obu pytań SO połączonych w tej odpowiedzi.
DVK,
2
Istnieją co najmniej cztery różne sposoby instalowania modułów z CPAN: ręcznie, moduł CPAN (i jego odpowiednik z linii poleceń cpan), CPANPLUSmoduł (i jego odpowiednik z linii poleceń cpanp) oraz nowa dystrybucja App :: cpanminus, która instaluje cpanm. Spośród nich uważam, że cpanmjest najłatwiejszy w instalacji i obsłudze. cpani cpanpsą instalowane domyślnie, ale do poprawnego działania wymagają znacznej konfiguracji.
Chas. Owens
404: Żądany adres URL / zapisywanie / artykuły / install-perl-modules-without-root nie został znaleziony na tym serwerze.
harschware
6

Aby uzyskać kompletność, jest to proces instalacji cpanmna OSX, jeśli chcesz zachować perl5poniż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
Juan A. Navarro
źródło
2

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
Britton Kerin
źródło
0

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
Yordan Georgiev
źródło