Lokale Umgebungen für Perl, Python und Ruby

Hin und wieder hat man auf einem System keine root-Rechte oder möchte diese nicht nutzen. Und oft will man gerade in solchen Situationen Perl-Module, Ruby Gems oder Python Eggs verwenden, die auf dem System nicht verfügbar sind. Erfreulicherweise bieten alle diese Sprachen Mechanismen an, mit denen sich Erweiterungen im Heimatverzeichnis des Benutzers installieren lassen.
Wie das im Einzelnen geht, beschreibt dieser Artikel.

Allgemeines

Ich arbeite hauptsächlich mit Mac OS X, alle Beispiele lassen sich aber auch mit einem aktuellen openSUSE umsetzen. Auf beiden Systemen kommt als Standard-Shell die bash zum Einsatz, die ich ebenfalls verwende. Alle Beispiele und Mechanismen sollten sich aber problemlos auch mit anderen Shells umsetzen lassen.

Perl

Zur Installation von Perl-Modulen ins Heimatverzeichnis bietet sich local::lib an. Dazu werden die folgenden Umgebungsvariablen benötigt:

export PERL_MM_OPT="INSTALL_BASE=${HOME}/perl5"
export PERL_MB_OPT="--install_base \"${HOME}/perl5\"" # oder
export MODULEBUILDRC=${HOME}/perl5/.modulebuildrc
export PERL5LIB=${HOME}/perl5/lib/perl5:${HOME}/perl5/lib/perl5/i386-linux
export PATH=${HOME}/perl5/bin:$PATH

PERL_MM_OPT wird von ExtUtils::MakeMaker verwendet. Die in PERL_MM_OPT angegebene Zeichenkette wird an den Whitespaces geteilt und die Resultate vor allen anderen Kommandozeilenargumenten ausgeführt. Mehr dazu ist hier zu finden.

Im Beispiel habe ich ein Verzeichnis namens perl5 in meinem Heimatverzeichnis angelegt, das die Verzeichnisse bin, lib und man enthält.

MODULEBUILDRC enthält den Pfad zu einer Datei mit den Optionen zum Bauen von Perl Modulen. Verwendet wird diese Datei von Module::Build. Details dazu sind hier zu finden.

In meinem Beispiel habe ich eine solche Datei in meinem lokalen Perl-Verzeichnis angelegt.

Alternativ kann auch die Variable PERL_MB_OPT verwendet werden. Diese wird ebenfalls von Module::Build ausgewertet. Eine gleichzeitige Verwendung mit MODULEBUILDRC ist nicht zu empfehlen. Weitere Details findet man hier.

PERL5LIB enthält die Pfade zu den Perl-Modulen. Bei den meisten Linux-Distributionen ind das die Verzeichnisse lib/perl5 und lib/perl5/i386-linux bzw. lib/perl5/x86_64-linux-thread-multi. Unter Mac OS X sind es lib/perl5 und lib/perl5/darwin-thread-multi-2level.
Alternativ kann auch die Variable PERLLIB verwendet werden, davon rate ich allerdings ab. Gründe dafür sind in diesem Artikel beschrieben.

Zu guter Letzt wird noch die Pfad-Variable um einen Eintrag ergänzt. Da einige Perl-Module ausführbare Scripts mitbringen, ist es sinnvoll, diese in den Pfad aufzunehmen.

Die Einträge für diese vier Umgebungsvariablen setzt man am besten in der .bashrc oder .bash_profile. Ist das passiert, kann man local::lib aus dem CPAN installieren.

Dazu muss man den Befehl cpan ausführen und auf die Frage „What approach do you want?“ mit local::lib antworten. Danach werden üblicherweise ExtUtils::MakeMaker und local::lib installiert. Zum Schluss fragt cpan noch, ob es die Einträge für PERL_MM_OPT und PERL_MB_OPT an die .bashrc anhängen soll. Falls das noch nicht geschehen ist (wie oben beschrieben), sollte man hier zustimmen.

Ein Blick in’s Verzeichnis perl5/lib/perl5 zeigt, dass das Modul local::lib installiert wurde.
Sämtliche weiteren Installationen von Perl-Modulen über cpan landen dann auch automatisch in diesem Verzeichnis.

Python

Für Python gibt es verschiedene Wege, Eggs aus dem Home-Verzeichnis zu integrieren.
Die einfachste Lösung funktioniert mit virtualenv und benötigt zwei Umgebungsvariablen.
Für das Beispiel habe ich mir ein Verzeichnis namens python in meinem Heimatverzeichnis angelegt.

export PYTHONPATH=${HOME}/python/lib/python2.7/site-packages:$PYTHONPATH
export PATH=${HOME}/python/bin:$PATH

PYTHONPATH enthält die Pfade zu allen Verzeichnissen, in denen Python nach Eggs suchen soll. Wichtig ist, dass das lokale Verzeichnis vor den anderen Pfaden durchsucht werden soll.

Das gleiche gilt für die Umgebungsvariable PATH. Da virtualenv viel mit symbolischen Links arbeitet, muss das lokale Verzeichnis als erstes im Pfad gefunden werden.

Um virtualenv zu installieren, sollte pip verfügbar sein. Ist das nicht der Fall, muss man virtualenv von Hand installieren. was hier beschrieben ist.

Andernfalls kann man es mit pip install --install-option="--prefix=${HOME}/python" virtualenv installieren. Damit sollte virtualenv im lokalen python Verzeichnis installiert sein.

Der nächste Schritt besteht darin, eine virtuelle Python-Umgebung zu erzeugen. Das passiert mit dem Kommando virtualenv ${HOME}/python. Wurden die Variablen bereits wie oben beschrieben gesetzt, liefert die Ausgabe von which python den Pfad zum Python Interpreter aus der lokalen Verzeichnis. Alle Pakete, die nun mit pip oder den setuptools installiert werden, landen automatisch im lokalen Verzeichnis.

Ruby

Ruby beherrscht von Haus aus einen Mechanismus, der es erlaubt, Gems im Heimatverzeichnis abzulegen. Damit sind keine Mechanismen wie local::lib oder virtualenv notwendig.

Es genügt, ein lokales Verzeichnis zu erstellen und zwei Umgebungsvariablen zu setzen:

export GEM_HOME=${HOME}/ruby
export PATH=${HOME}/ruby/bin:$PATH

GEM_HOME ist der Pfad, in den alle Gems installiert werden. Ist die Umgebungsvariable gesetzt, wird sie automatisch von allen Ruby-Werkzeugen benutzt. Auch Ruby Gems bringen hin und wieder Scripts mit, die im Pfad gefunden werden müssen. Deshalb darf ein Eintrag auf die lokalen Ruby-Scripts in der PATH Umgebungsvariable nicht fehlen. Auch für Ruby ist es empfehlenswert, diesen Eintrag vor die anderen Pfad-Einträge zu stellen, damit die lokale Installation bevorzugt wird.

Weitere Schritte sind für Ruby nicht notwendig. Die Installation der Gems kann danach direkt losgehen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.