Wie kann ich CPAN als Nicht-Root-Benutzer verwenden?

80

Ich möchte Perl-Module auf einem gemeinsam genutzten Server installieren, auf dem ich keinen Root-Zugriff habe. Wie kann ich das machen? Sie scheinen auch eine ältere Version von CPAN zu haben (dies wird beim Ausführen des Befehls beanstandet). Ist es möglich, den von meinem Konto verwendeten CPAN-Befehl zu aktualisieren, ohne Root-Zugriff zu benötigen?

Juan A. Navarro
quelle

Antworten:

137

Die einfachste Methode, die ich bisher gefunden habe, ist zu sagen

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

Dies setzt voraus , Ihr Profil gestattet .profile, die Sie ändern müssen , dass sein .bash_profile, .bashrcusw. Danach können Sie Module installieren können sagen ,

cpanm Module::Name

und verwenden Sie sie einfach so, wie Sie es tun würden, wenn sie in den Stammverzeichnissen installiert wären.


Was folgt, ist eine kurze Erklärung, was die obigen Befehle tun.

wget -O- http://cpanmin.usholt die neueste Version von cpanmund druckt sie aus, an STDOUTdie dann weitergeleitet wird perl - -l ~/perl5 App::cpanminus local::lib. Der erste -sagt perl, dass das Programm erwartet STDINwird. perlDadurch wird die cpanmgerade heruntergeladene Version ausgeführt . perlübergibt den Rest der Argumente an cpanm. Das -l ~/perl5Argument gibt an, cpanmwo Perl-Module installiert werden sollen, und die beiden anderen Argumente sind zwei zu installierende Module. [App::cpanmins] 1 ist das Paket, das installiert wird cpanm. local::libist ein Hilfsmodul, das die Umgebungsvariablen verwaltet, die zum Ausführen von Modulen im lokalen Verzeichnis erforderlich sind.

Nachdem diese Module installiert sind, laufen wir

eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`

um die Umgebungsvariablen festzulegen, die für die Verwendung der lokalen Module erforderlich sind, und dann

echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile

um sicherzustellen, dass wir sie beim nächsten Anmelden verwenden können.

echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile

wird hoffentlich dazu führen, dass man die Manpages für Ihre lokalen Module findet.

Chas. Owens
quelle
+1 für cpanminus ... habe es nie benutzt, kann mich also nicht so fühlen, als ob ich es empfehlen sollte, aber ich mag es von dem, was ich bisher gesehen habe
DVK
7
Das hat bei mir hervorragend funktioniert. Nur eine kleine Anmerkung, um zuerst alle vorhandenen PERL5LIB-Umgebungsvariablen zu entfernen, die sich bereits in Ihrem ~ / .profile befinden (oder was auch immer). Andernfalls kann local :: lib beim Ausführen des ersten Befehls nicht installiert werden.
Juan A. Navarro
@juannavar Guter Punkt, ich neige dazu, es auf neu installierten Computern zu installieren, daher stoße ich nicht auf diesen Fall.
Chas. Owens
Tolles Beispiel für die Verwendung von wget anstelle von curl - viele Systeme werden standardmäßig nicht mit curl geliefert, obwohl sie wget verwenden. Dies ist daher hilfreich für Benutzer ohne root, um neue Pakete zu installieren.
AndrewPK
1
@HielkeWalinga Untergeordnete Prozesse können die Umgebung übergeordneter Prozesse nicht ändern. Um dies zu bewältigen, drucken Befehle wie perl -I ~/perl5/lib/perl5 -Mlocal::liboder ssh-agent, die Umgebungsvariablen für einen übergeordneten Prozess festlegen müssen, die Befehle aus, die im übergeordneten Prozess ausgeführt werden müssen, und dann Sie eval. Sie brauchen evalsie aber nicht wirklich . Man könnte sagen perl -I ~/perl5/lib/perl5 -Mlocal::lib > /tmp/commands; source /tmp/commands, aber die Eval-Methode ist sauberer (keine Dateien zum Bereinigen oder versehentlichen Überschreiben).
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/

Der Hauptschritt in beiden Befehlssätzen umfasst das Modul local :: lib

AFAIK, CPAN-Logik ist im Perl-Modul (CPAN.pm) enthalten. Dies bedeutet, dass Sie das neuere wie jedes andere Perl-Modul auch problemlos in Ihrem lokalen Verzeichnis installieren können.


Wenn Sie Ihre Module an einem nicht standardmäßigen Speicherort installiert haben, lesen Sie diese beiden Fragen zum Laden von Bibliotheken von nicht standardmäßigen Speicherorten (einige der Informationen sind bereits über den obigen Link verfügbar):

Woher weiß ein Perl-Programm, wo sich die Datei mit dem verwendeten Perl-Modul befindet?

Wie ist Perls @INC aufgebaut? (aka Wie können Sie beeinflussen, wo nach Perl-Modulen gesucht wird?)

DVK
quelle
Offenlegung - Ich habe beide SO-Fragen verfasst, die in dieser Antwort verlinkt sind.
DVK
2
Es gibt mindestens vier verschiedene Möglichkeiten, Module aus CPAN zu installieren : manuell , das CPAN-Modul (und sein Befehlszeilenäquivalent cpan), das CPANPLUSModul (und sein Befehlszeilenäquivalent cpanp) und die neu installierte App :: cpanminus-Distribution cpanm. Von diesen finde ich cpanmes am einfachsten zu installieren und zu verwenden. cpanund cpanpsind standardmäßig installiert, erfordern jedoch ein umfangreiches Setup, um ordnungsgemäß zu funktionieren.
Chas. Owens
404: Die angeforderte URL / writing / articles / install-perl-modules-without-root wurde auf diesem Server nicht gefunden.
Harschware
6

Der Vollständigkeit cpanmhalber ist dies der Installationsprozess von unter OSX, wenn Sie Ihre perl5unter behalten möchten ~/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
quelle
2

Wenn Sie auch Manpages für die von cpanminus installierten Module lesen möchten, sollten Sie außerdem sicherstellen, dass sich das richtige Unterverzeichnis des ausgewählten Bibliothekspfads in MANPATH befindet. Die obige Lösung, die den Installationsprozess von cpanm zeigt, benötigt den folgenden zusätzlichen Befehl:

 export MANPATH=$HOME/Library/perl5/man:$MANPATH' >> ~/.bash_profile
Britton Kerin
quelle
0

Wir haben in den letzten 6 Monaten die folgende Funktion für über 20 erfolgreiche Bereitstellungen von automatisierten Bereitstellungen für aws verwendet, die von der Hauptbereitstellung wie folgt aufgerufen wurden. Dies ist im Grunde nur eine Kopie der obigen Antworten, jedoch in einer einzigen Wiederholung verwendbares Bash-Skript:

 #! /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
quelle