web-dev-qa-db-de.com

Wo installiert CPAN Module?

Ich kann keine aussagekräftige/umfassende Beschreibung finden, wo CPAN seine Dateien installiert. Ich gehe davon aus, dass es eine Reihe von Regeln geben muss und dass dies nicht so einfach ist wie das "XYZ-Verzeichnis", da zum Beispiel mehrere Benutzer auf einer Linux-Box CPAN ausführen können, obwohl es eine einzige Perl-Installation gibt und es trotzdem funktioniert. Wie lauten diese Regeln?

Ein zweiter Teil dieser Frage: In der Dokumentation zur Umgebungsvariablen Perl5LIB heißt es: "Eine Liste der Verzeichnisse, in denen nach Perl-Bibliotheksdateien gesucht werden muss, bevor die Standardbibliothek und das aktuelle Verzeichnis durchsucht werden."

Ich gehe davon aus, dass CPAN nicht in der Standardbibliothek installiert wird, da dies vermutlich für eine bestimmte Perl-Version behoben ist. Vielleicht wird CPAN in Perl5LIB installiert?

Und schließlich, wie ich bereits angedeutet habe, wie geht CPAN damit um, dass mehrere Benutzer möglicherweise dieselbe Perl-Installation ausführen? Tut mir leid, wenn das eine separate Frage ist, aber es scheint wahrscheinlich verwandt zu sein.

7
Stephen

Perl gibt drei Sätze von Installationsorten an.

  • Perl für Module, die in Perl selbst enthalten sind.
  • vendor für Module, die vom Provider Ihrer Perl-Binärdatei installiert werden.
  • site für Module, die mit cpan installiert wurden.

Jeder dieser Sätze stellt Installationsorte für eine Reihe von Dateitypen bereit.

                        Installation location
                        --------------------------------------------------------
Type of file            Perl             vendor                 site
----------------------  ---------------  ---------------------  -------------------
Build-specific modules  installarchlib   installvendorarch      installsitearch
Modules                 installprivlib   installvendorlib       installsitelib
Binary programs         installbin       installvendorbin       installsitebin
Other programs          installscript    installvendorscript    installsitescript
man pages for scripts   installman1dir   installvendorman1dir   installsiteman1dir
man pages for modules   installman3dir   installvendorman3dir   installsiteman3dir
html docs for scripts   installhtml1dir  installvendorhtml1dir  installsitehtml1dir
html docs for modules   installhtml3dir  installvendorhtml3dir  installsitehtml3dir

Sie können den Pfad für jeden dieser Standorte folgendermaßen erhalten:

Perl -V:{var}

Sie können alle Pfade für diese Standorte folgendermaßen erhalten:

Perl -V:'install.*'

Dies sind die Standardeinstellungen, die von den Installationsprogrammen verwendet werden[1]. Bei den beiden am häufigsten verwendeten Installationsprogrammen kann der Benutzer jedoch alle diese Einstellungen außer Kraft setzen. Wenn ein Modul an einem anderen Ort als dem Standard installiert ist, kann mit Perl5LIBPerl angegeben werden, wo das Modul zu finden ist.


  1. CPAN installiert keine Module. Es ist ein Repository.

    cpan installiert keine Module. cpan lädt Distributionen von CPAN herunter und führt das Installationsprogramm aus, Makefile.PL und Build.PL. (Gleiches gilt für cpanm und cpanp.)

    Diese Skripte verwenden meistens ExtUtils :: MakeMaker oder Module :: Build install selbst (obwohl andere Installationsprogramme vorhanden sind).

6
ikegami

CPAN installiert keine Dateien. Es führt das in jede Distribution eingebettete Installationsskript aus, das dann die eigentliche Installation durchführt.

Für Distributionen, die ExtUtils :: MakeMaker verwenden, sind die Standardeinstellungen hier dokumentiert: https://metacpan.org/pod/ExtUtils::MakeMaker#make-install (und der Standardwert von INSTALLDIRS ist site) . Für Module :: Build siehe https://metacpan.org/pod/Module::Build#INSTALL-PATHS .

Wenn in der Dokumentation von $Config{foo} oder %Config die Rede ist, bedeutet dies die %Config-Variable, die von dem Modul Config bereitgestellt wird. Der Wert von $Config{foo} kann auch durch Ausführen von Perl -V:foo überprüft werden.

(Wenn Sie denken, dass dies unnötig kompliziert erscheint, haben Sie recht.)

Die Kurzversion ist, dass Perl mehrere "Systemverzeichnisse" hat, von denen eines für "standortspezifische" Module gilt und daher als Standardinstallationsziel verwendet wird. Sie haben Recht, dass dies ein einzelnes Verzeichnis ist (per Perl-Installation), das sich nicht gut in ein Mehrbenutzersystem einfügt: Es wird von allen Benutzern gemeinsam genutzt, und Sie benötigen Rootberechtigungen für die Installation von Modulen ( überschreiben Sie Module aus Systempaketen, was keine gute Idee ist).

Stattdessen müssen Sie ExtUtils :: MakeMaker, Module :: Build usw. für die Installation im Basisverzeichnis eines Benutzers konfigurieren. Dies kann mit Umgebungsvariablen erfolgen. Dann weisen sie Perl an, dieses Verzeichnis zu @INC hinzuzufügen, damit Module tatsächlich gefunden und geladen werden können. Dies geschieht mit einer anderen Umgebungsvariablen, Perl5LIB. (Perl5LIB wirkt sich nicht auf die Installation aus, es wird nur zum Laden verwendet.)

Alles oben genannte ist automatisiert und in local :: lib gekapselt. (local :: lib kann auch verwendet werden, um beispielsweise ein Modul-Unterverzeichnis pro Projekt zu erstellen.)

Die CPAN-Dokumentation sagt auch:

Wenn Sie nicht über die Berechtigung zum Schreiben der Standardverzeichnisse der Perl-Bibliothek verfügen, werden Sie vom CPAN-Konfigurationsprozess ab CPAN 1.9463 gefragt, ob Sie local::lib bootstrappen möchten. Dies macht es einfacher, ein persönliches Perl-Bibliotheksverzeichnis zu erstellen.


Sie können das gesamte Problem umgehen, indem Sie ein privates Perl in Ihrem Home-Verzeichnis installieren (in diesem Fall ist das "System" -Verzeichnis nur ein weiteres Unterverzeichnis unter Ihrem $HOME und daher für niemanden freigegeben und kann von Ihnen geschrieben werden). Dies ist mit z. perlbrew .


Noch ein Hinweis: Sie haben gerade einen Fehler in der Dokumentation für Perl5LIB gefunden. " und das aktuelle Verzeichnis " ist veraltet: . wurde aus Sicherheitsgründen aus der Standardliste der Modulspeicherorte entfernt.

2
melpomene

Dies ist eine komplexe Frage. Sie können feststellen, wo sich die Bibliotheken von core befinden, indem Sie den Ort einer der Bibliotheken suchen:

perldoc -l B

Hier erfahren Sie, wo sich das B-Kernmodul befindet. Und Sie können andere mit anderen Ergebnissen versuchen ...

Außerdem gibt Ihnen Perl -V alle relevanten Shell-Variablen zusammen mit dem Wert von @INC an, den Stellen, an denen Bibliotheken gesucht werden.

Core Bibliotheken befinden sich normalerweise an anderen Stellen als local Bibliotheken. Wenn Sie perlbrew und local::lib verwenden, müssen Sie möglicherweise weitere Punkte berücksichtigen. In Bezug auf Shell-Variablen haben Sie neben Perl5LIB auch Perl_LOCAL_LIB_ROOT.

Zu Ihrer anderen Frage würde ich sagen, dass root Bibliotheken systemweit installieren kann. Jeder Benutzer hat diese und dann alle lokalen Stellen mithilfe von Shell-Variablen oder anderen Mitteln wie Befehlszeilenoptionen Perl -I <lib location> oder im Code wie use lib <lib location>;.

Es gibt auch perlbrew , das zusammen mit local::lib einem nicht privilegierten Benutzer die Installation von Perl und Bibliotheken in lokalen Verzeichnissen ermöglicht.

Was die Möglichkeiten betrifft, Module über CPAN zu installieren, ist mein Favorit cpanminus . Es wird mit cpanm <library to install> aufgerufen. Es versagt nie ...

0
Javier Elices