use local::lib; # Benutzt das Verzeichnis ~/perl5 zum anlegen des lokalen lib/ Verzeichnisses use local::lib '~/foo'; # das selbe, aber mit ~/foo # Oder... use FindBin; use local::lib "$FindBin::Bin/../support"; # Applikationsspezifische Sammlung von Modulen
Von der Shell -
# Installiert LWP und alle notwendigen Abhängigkeiten in das '~/perl5' Verzeichnis perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)' # Gibt die Shell Kommandos aus um die Umgebung vorzubereiten $ perl -Mlocal::lib export PERL_MB_OPT='--install_base /home/username/perl5' export PERL_MM_OPT='INSTALL_BASE=/home/username/perl5' export PERL5LIB='/home/username/perl5/lib/perl5/i386-linux:/home/username/perl5/lib/perl5' export PATH="/home/username/perl5/bin:$PATH"
Selbst wenn du administrative Rechte hast, ist es wichtig das die Umgebungsvariablen von Schritt 4 in deinem Shell Startup Skript gesetzt werden. Ohne diesen Schritt werden die Module von CPAN weiterhin im System installiert und auch Perl Skripte die du startest würden das von local::lib erstellte lib/ Verzeichnis nicht nutzen.
Standardmäßig installiert sich local::lib in ~/perl5.
Windows Benutzern müssen ausserdem dies hier lesen: ``Unterschiede bei Benutzung dieses Module mit Win32''.
1. Lade das Tar-Archiv von CPAN runter (Suche nach ``Download'' auf der CPAN Seite von local::lib) und entpacke es in einem beliebigem Verzeichnis. Um das obige Problem zu vermeiden, sollte man dies als normaler User tun und nicht als root oder Administrator.
2. Starte in dem entstandenen Verzeichnis folgenden Befehl:
perl Makefile.PL --bootstrap
Wenn das System dir vorschlägt gewisse Dinge eigenständig zu konfigurieren ist es in fast allen Fällen vollkommen in Ordnung einfach ``yes'' zu antworten.
Falls du local::lib nicht in das Standard Verzeichnis installieren willst, musst du dieses Verzeichnis als Parameter angeben:
perl Makefile.PL --bootstrap=~/foo
3. Danach folgenden Befehl starten: (local::lib erwartet make auf dem System)
make test && make install
4. Nun müssen wir die benötigten Umgebungsvariablen, damit Perl unser neu generiertes lib/ Verzeichnis benutzt. Wenn du bash oder eine andere Bourne Shell benutzt, kannst du es über diesen Weg zu deinem Shell Startup Skript hinzufügen:
echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc
Wenn du C Shell benutzt, du kannst das gleiche hiermit erreichen:
/bin/csh echo $SHELL /bin/csh perl -I$HOME/perl5/lib/perl5 -Mlocal::lib >> ~/.cshrc
Wenn du beim bootstrappen ein anderes Verzeichnis benutzt als das Standardverzeichnis, dann musst du dieses Verzeichnis als Parameter beim Laden des Modules local::lib angeben:
echo 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' >>~/.bashrc
Nachdem diese Änderungen in deinem Shell Startup Skript gemacht wurden, ist es nun wichtig das diese Umgebungsvariablen auch gesetzt sind in deiner aktuellen Umgebung. In Bourne Shells macht man dies z.B. mit ". ~/.bashrc", und in C Shell würde man es mit: "source ~/.cshrc" mit.
Wenn du eine sehr langsames System hast, oder du unter drakonischen Regulierungen des Plattenplatz leben musst, kann man die automatische Generierung der manpages vom POD bei der Installation des Moduls deaktivieren beim bootstrapping mit dem "--no-manpages" Parameter:
perl Makefile.PL --bootstrap --no-manpages
Um zu vermeiden das man mehrere bootstraps macht um z.B. für verschiedene Applikationen eigene local::lib Installationen zu nutzen, kann man eine dieser Umgebungen benutzen um einfach in beliebigen anderen Verzeichnis Module zu installieren und somit weitere eigenständige lib/ Umgebungen zu bekommen:
cd ~/mydir1 perl -Mlocal::lib=./ eval $(perl -Mlocal::lib=./) ### Um die Umgebungsvariablen für die ### aktuelle Shell zusetzen printenv ### Hier kannst du sehen das ~/mydir1 ### in der PERL5LIB Umgebungsvariable ### steht perl -MCPAN -e install ... ### welche Module auch immer ... cd ../mydir2 ... WIEDERHOLEN ...
Für mehrere Umgebungen in dieser Form brauch man eine Modifikation in der Benutzung von "use FindBin" in dem ``Im Code'' Beispiel oben. Wenn du sowas machst, und du hast damit z.B. Perl Module nach "~/mydir1/lib" installiert und du hast ein Script in "~/mydir1/scripts/myscript.pl", du musst dort angeben das die Module die es braucht im Verzeichnis "~/mydir1/lib" liegen.
In "~/mydir1/scripts/myscript.pl" steht dann:
use strict; use warnings; use local::lib "$FindBin::Bin/.."; ### zeigt auf ~/mydir1 und local::lib ### findet dort lib use lib "$FindBin::Bin/../lib"; ### zeigt auf ~/mydir1/lib
Setze das vor jeden BEGIN { ... } Block der die Module braucht die du installiert hast.
C:\>perl -Mlocal::lib set PERL_MB_OPT=--install_base C:\DOCUME~1\ADMINI~1\perl5 set PERL_MM_OPT=INSTALL_BASE=C:\DOCUME~1\ADMINI~1\perl5 set PERL5LIB=C:\DOCUME~1\ADMINI~1\perl5\lib\perl5;C:\DOCUME~1\ADMINI~1\perl5\lib\perl5\MSWin32-x86-multi-thread set PATH=C:\DOCUME~1\ADMINI~1\perl5\bin;%PATH% ### Um die Umgebungsvariablen für diese Shell alleine zu setzen C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\temp.bat ### anstelle von $(perl -Mlocal::lib=./) in bash.
Wenn du willst das die Umgebungsvariablen dauerhaft gesetzt sind, musst du diese in Systemsteuerung / System dauerhaft selber eintragen oder App::local::lib::Win32Helper benutzen.
Die ``~'' wird übersetzt zu dem Benutzer Profil Verzeichnis (das Verzeichnis was beim User als ``Dokumente und Einstellungen'' bekannt ist unter Windows XP und vorher oder das ``Benutzer'' Verzeichnis bei Windows Vista und später), solange $ENV{HOME} nicht gesetzt ist. Das Verzeichnis wird hierbei zu dem korrekten Kurznamen umgewandelt, und muss daher definitiv existieren, und wird um die nötigen Unterverzeichnise erweitert.
local::lib löst dieses Problem, es erlaubt dir dein komplett eigenes Verzeichnis für deine CPAN Module zu haben und bist so nicht genötigt die Module vom System zu nutzen oder andersrum andere User nicht mit individuellen Modulwünschen zu Überarbeitung ihres Codes zu zwingen, weil bestimmte Module zentral für alle auf neuere Version upgedatet werden. Die Installation findet hierbei dann z.B. im Home Verzeichnis statt. Es werden nur Umgebungsvariablen gesetzt die das installierte Perl dazu bewegen die im Homeverzeichnis installierten Module zu benutzen, zusätzlich und vorgezogen zu denen auf dem System.
Daher muss man sich wenn man ein Paket System benutzt, wie z.b. Debian, garnicht mehr Sorgen machen, irgendwas auf dem System zu verletzten nur durch die Installation von Perl Modulen.
Weitergehend ist local::lib in der Lage Module zu nutzen die nicht im standardmäßigen @INC Pfad von Perl enthalten sind. Das macht es einfacher für bestimmte Applikationen ein bestimmtes Set von Modulen zu installieren ohne die anderen Module auf dem System in irgendeiner Art anzufassen. Damit es z.B. auch sicherer Module zu installieren die vom Maintainer noch nicht als Release verfügbar sind.
Beim Import setzt local::lib die folgenden Umgebungsvariablen zu den nötigen Werten:
Diese Werte sind dann verfügbar für jeden Code der danach importiert wurde.
Versucht den angegebenen Pfad anzulegen, mit allen nötigen drüberliegenden Verzeichnissen. Im Fehlerfall wird eine Exception geworfen.
Gibt die Umgebungsvariablen aus, die benötigt werden um den angegebenen Pfad als Basis Verzeichnis zu nutzen.
Gibt ein Hash zurück mit den Variablen die nötig sind in den Umgebungsvariablen um eine Installation in dem gegebenen Pfad zu benutzen.
Setzt die %ENV Einträge basierend auf dem Aufruf von ``build_environment_vars_for''.
Gibt den Pfad zurück der benutzt wird um Perl Module zu installieren bei dem gegebenen Pfad als Basis. Prinzipiell wird nur "lib" und "perl5" als Pfadelemente angehangen.
Gibt den Pfad zurück der benutzt wird um die Architektur-abhängigen Perl Module zu installieren basirend auf dem angegebenen Pfad als Basis. Basierend auf dem was ``install_base_perl_path'' zurückgibt, and appends the value of $Config{archname}.asis.
Gibt den Pfad zurück, wo ausführbare Programme installiert werden, basierend auf der Basis des angegebenen Pfad. Basierend auf ``install_base_perl_path'' Rückgabewert, hängt diese Methode noch "bin" an.
Erstellt und gibt zurück den Pfad der benutzt wird als Basis zur Installation der Module. Standardmäßig dies ist "~/perl5".
Versucht das Home Verzeichnis vom aktullen User zu finden. Wenn "File::HomeDir" installiert ist, für dieses benutzt dafür. Es wird eine Exception geworfen, wenn kein Home Verzeichnis ermittelt werden konnte.
Macht aus dem angegebenen Pfad einen absoluten Pfad.
Hierbei wird der Pfad durch die folgende Methoden gegeben, wobei der Rückgabewert der ersten an die nächste weitergeben wird, um die Umgebung zu konfigurieren für die lokale Bibliotheks Installation: ``resolve_empty_path'', ``resolve_home_path'', ``resolve_relative_path''. Der daraus resultierende Pfad wird zu ``resolve_empty_path'' übergeben, dessen Resultat dann weitergegeben wird an ``resolve_home_path'', wessen Resultat dann weitergegeben wird an ``resolve_relative_path''. Dieses Resultat wird dann final an ``resolve_path'' übergeben, welches dann den Rückgabewert stellt.
Die Shell Erkennung ist sehr primitiv. Derzeit ist es so das alles was ``csh'' im Namen hat auch als C Shell eingeordnet wird, und alles andere wird als Bourne Shell betrachet, ausser auf Win32 Systemen. Wenn die "SHELL" Variable nicht gesetzt ist, eine Bourne Shell wird angenommen.
Bootstrap ist leider ein Hack, und wird auf jedenfall CPAN.pm benutzen für ExtUtils::MakeMaker, auch wenn CPANPLUS installiert ist.
Es setzt definitiv PERL5LIB, PERL_MM_OPT und PERL_MB_OPT neu und vernichtet jeden Wert der vorher gesetzt war.
Es sollte vielleicht eine automatische Korrektur der CPAN Config machen, wenn das nicht schon gemacht wurde.
``Patches Welcome'' - Patches sind immer willkommen beim Autor oder den anderen Mitwirkenden.
Auf Win32 Systemen werden die Umgebungsvariablen nicht direkt in die Registrierung geschrieben damit sie auch nach dem Neustarten erhalten bleiben.
Um dies zu korrigieren, einfach nochmal die bootstrapping Methode laufen lassen, wie oben beschrieben.
Dann starte "rm -r ~/.cpan/build/Foo-Bar*"
Abschliessend dann nochmal mit "cpan -i Foo::Bar" installieren und die Probleme sollten verschwunden sein.
Auf Win32 Systemen, "COMSPEC" wird auch analysiert.
Wir sind im Channel #local-lib auf dem Server irc.perl.org.