local::lib~[de](3) Erschaffen und benutzen von Perl Modulen in einem lokalen lib/ Verzeichnis mit PERL5LIB

SYNOPSIS

Im Code -


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 Abha.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 MODULEBUILDRC=/home/username/perl/.modulebuildrc
  export PERL_MM_OPT='INSTALL_BASE=/home/username/perl'
  export PERL5LIB='/home/username/perl/lib/perl5:/home/username/perl/lib/perl5/i386-linux'
  export PATH="/home/username/perl/bin:$PATH"

Die Bootstrapping Methode

Ein typischer Weg um local::lib zu benutzen ist die sogenannte ``Bootstrapping'' Methode. Diese Methode wird benutzt wenn noch kein local::lib auf dem System installiert ist. In diesem Fall kannst du einfach local::lib direkt in deinem Home-Verzeichnis installieren.

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 wu.rden das von local::lib erstellte lib/ Verzeichnis nicht nutzen.

Windows Benutzern mu.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 vorschla.gt gewisse Dinge eigensta.ndig zu konfigurieren ist es in fast allen Fa.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 mu.ssen wir die beno.tigten Umgebungsvariablen, damit Perl unser neu generiertes lib/ Verzeichnis benutzt. Wenn du bash oder eine andere Bourne Shell benutzt, kannst du es u.ber diesen Weg zu deinem Shell Startup Skript hinzufu.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 A.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 wu.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

Wenn du mehrere lokale lib/ Installationen nutzen mo.chtest, z.B. fu.r verschiedene Applikationen. Hierfu.r kannst du local::lib einfach einm

Um zu vermeiden das man mehrere bootstraps macht um z.B. fu.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 eigensta.ndige lib/ Umgebungen zu bekommen:

  cd ~/mydir1
  perl -Mlocal::lib=./
  eval $(perl -Mlocal::lib=./)  ### Um die Umgebungsvariablen fu.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 ...

Fu.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.

Unterschiede bei Benutzung dieses Module mit Win32

Um die no.tigen Umgebungsvariablen fu.r diese Variablen in der derzeitigen Sitzung mit "CMD.EXE" zu setzen, kann man folgendes kommando nutzen:

  C:\>perl -Mlocal::lib
  set MODULEBUILDRC=C:\DOCUME~1\ADMINI~1\perl5\.modulebuildrc
  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 fu.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 u.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 spa.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 no.tigen Unterverzeichnise erweitert.

GRUNDPRINZIP

Die Version von den Perl Paketen die man beno.tigt fu.r spezifische Aufgaben sind sehr ha.ufig nicht die richtigen oder korrekten Versionen auf dem System vorinstalliert. Ein Updaten von diesen Modulen ist in vielen Fa.llen einfach nicht mo.glich weil die no.tigen Rechte fehlen. Ausserdem ist es generell nicht gut eigensta.ndig die Versionen der Module auf dem System auszutauschen, weil natu.rlich der Rest des Systems genau die Version erwartet die von der Systemverwaltung auch installiert wurde.

local::lib lo.st dieses Problem, es erlaubt dir dein komplett eigenes Verzeichnis fu.r deine CPAN Module zu haben und bist so nicht geno.tigt die Module vom System zu nutzen oder andersrum andere User nicht mit individuellen Modulwu.nschen zu U.berarbeitung ihres Codes zu zwingen, weil bestimmte Module zentral fu.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, zusa.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.

BESCHREIBUNG

Dieses Modul bietet eine schnelle und legitime Art und Weise ein sogenanntes bootstrapping zu machen um in einem User Homeverzeichnis eine Sammlung von Modulen zu installieren. Es erstellt auch die no.tigen Umgebungsvariablen die beno.tigt werden um diese Module zu nutzen, passend zu der Shell die der User in der Umgebungsvariable "SHELL" angegeben hat, um dann direkt passend in die entsprechenden Konfigurationsdateien der Shell einfu.gt zu werden.

Weitergehend ist local::lib in der Lage Module zu nutzen die nicht im standardma.βigen @INC Pfad von Perl enthalten sind. Das macht es einfacher fu.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 verfu.gbar sind.

Beim Import setzt local::lib die folgenden Umgebungsvariablen zu den no.tigen Werten:

MODULEBUILDRC
PERL_MM_OPT
PERL5LIB
PATH
Am PATH wird natu.rlich angehangen, und nicht ersetzt.

Diese Werte sind dann verfu.gbar fu.r jeden Code der danach importiert wurde.

CREATING A SELF-CONTAINED SET OF MODULES

"U.bersetzung fehlt..."

METHODS

"U.bersetzung fehlt..."

A WARNING ABOUT UNINST=1

Wenn man local::lib in Kombination mit ``make install UNINST=1'' benutzt, muss man vorsichtig sein u.ber die Tatsache das der Prozess u.ber die Neuinstallation eine nicht ausreichende Sicherheit hat bezu.glich wo er nun installieren muss. Hierdurch mann es passieren das beim deinstallieren eines Modul u.U. das globale Modul deinstalliert wird (wenn die Rechte vorhanden sind) aber die neue Version nur in der lokalen Version installiert ist. Es ist hier also sehr wichtig das man ``make install UNINST=1'' und local::lib nur gleichzeitig benutzt wenn man sehr sicher daru.ber ist welche Konsequenzen einem entgegenkommen.

EINSCHRA.NKUNGEN

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 fu.r ExtUtils::MakeMaker, auch wenn CPANPLUS installiert ist.

Es setzt definitiv PERL5LIB, PERL_MM_OPT und MODULEBUILDRC 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.

FEHLERANALYSE

Wenn du local::lib konfiguriert hast CPAN Module in deinem Home Verzeichnis zu installieren, und du danach versuchst mit "cpan -i Foo::Bar" ein Modul zu installieren, und dabei einen Fehler bekommst, wie: "Warning: You do not have permissions to install into /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux at /usr/lib64/perl5/5.8.8/Foo/Bar.pm" und in der installationsausgabe steht irgendwo ein Fehler der sagt "'INSTALL_BASE' is not a known MakeMaker parameter name", dann hast du aus irgendeinem Grund dein neue Version von ExtUtils::MakeMaker verloren.

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.

UMGEBUNGSVARIABLEN

SHELL
COMSPEC
local::lib schaut in die "SHELL" Umgebungsvariable um die korrekten Kommandos zu der Shell Konfiguration hinzuzufu.gen.

Auf Win32 Systemen, "COMSPEC" wird auch analysiert.

SUPPORT

IRC:

    Wir sind im Channel #local-lib auf dem Server irc.perl.org.

AUTOR DER U.BERSETZUNG

Torsten Raudssus <[email protected]> http://www.raudssus.de/

URHEBERRECHT

Copyright (c) 2007 - 2010 von den local::lib ``AUTHOR'' und ``CONTRIBUTORS'' aufgelistet in local::lib.

LIZENZ

Diese Sammlung ist freie Software und kann unter der selben Lizenz verbreitet werden wie Perl selber.