perl -MCPAN -e shell;
Batch-Modus (Stapelverarbeitung):
use CPAN; autobundle, clean, install, make, recompile, test
Die Module werden von einer oder mehreren gespiegelten CPAN-Sites (Comprehensive Perl Archive Network) heruntergeladen und in einem dedizierten Verzeichnis entpackt.
Das CPAN-Modul unterstützt auch das Konzept benannter und mit einer Versionsnummer ausgestatteter 'Modul-Bundles'. Bundles vereinfachen die Handhabung von Gruppen zusammengehöriger Module. Mehr dazu im weiter unten folgenden Abschnitt BUNDLES.
Das Paket enthält einen Session- und einen Cache-Manager. Ein Status zwischen den einzelnen Sessions bleibt nicht erhalten. Der Session-Manager überwacht nur innerhalb der laufenden Session, was heruntergeladen, generiert und installiert wurde. Der Cache-Manager überwacht den durch make-Prozesse belegten Plattenspeicher und löscht überschüssigen Speicher mit Hilfe eines einfachen FIFO-Mechanismuses.
Für erweiterte Suchoperationen steht ein CPAN-Plugin zur Verfügung. CPAN::WAIT ist eine Volltext-Suchmaschine, die alle in CPAN-Autorenverzeichnissen enthaltenen Dokumente indexiert. Ist CPAN::WAIT auf Ihrem System installiert, aktiviert die interaktive Shell von <CPAN.pm> die Befehle wq, wr, wd, wl und wh. Diese Befehle senden Queries an den bei Ihrer Installation konfigurierten WAIT-Server.
Alle anderen zur Verfügung gestellten Methoden sind über Programmaufrufe und über eine interaktive Shell erreichbar.
perl -MCPAN -e shell
Das bringt Sie zu einer readline-Schnittstelle. Die größte Freude werden Sie haben, wenn Sie Term::ReadKey und Term::ReadLine installieren und dadurch sowohl History-Funktionen als auch Befehlskomplettierung genießen können.
Sobald Sie in der Kommandozeile gelandet sind, können Sie 'h' eingeben, und der Rest sollte dann selbsterklärend sein.
Die häufigsten Anwendungen des interaktiven Modus sind:
a, b, d und m sowie einen weiteren, i, für einen beliebigen der obengenannten Befehle. Jede dieser vier Entitäten ist als Klasse mit leicht unterschiedlichen Methoden zur Ausgabe eines Objekts definiert.
Argumente können Sie diesen Befehlen in Form von Strings übergeben, die dem Identifikations-String eines Objekts genau entsprechen. Alternativ können Sie reguläre Ausdrücke übergeben, die dann, unabhängig von der Schreibweise, mit verschiedenen Attributen der Objekte verglichen werden. Der Parser erkennt einen regulären Ausdruck nur, wenn Sie ihn mit zwei Slashes umschließen.
Prinzipiell ist es so, daß die Anzahl der gefundenen Objekte beeinflußt, wie ein Element ausgegeben wird. Entdeckt die Suche nur ein Element, wird das Ergebnis als object->as_string ausgegeben. Wird hingegen mehr als ein Element gefunden, geben wir jedes Element als object->as_glimpse aus. Beispiele:
cpan> a ANDK
Author id = ANDK
EMAIL a.koenig@franz.ww.TU-Berlin.DE
FULLNAME Andreas König
cpan> a /andk/
Author id = ANDK
EMAIL a.koenig@franz.ww.TU-Berlin.DE
FULLNAME Andreas König
cpan> a /and.*rt/
Author ANDYD (Andy Dougherty)
Author MERLYN (Randal L. Schwartz)
Alle makes und tests werden in jedem Fall ausgeführt. Auch
install <distribution_file>
wird immer ausgeführt. Bei
install <module>
prüft CPAN hingegen, ob eine Installation tatsächlich nötig ist, und gibt module up to date aus, wenn die das Modul enthaltende Distributionsdatei nicht aktualisiert werden muß.
CPAN protokolliert auch, was innerhalb der aktuellen Session passiert ist, und versucht nicht, ein Paket ein zweitesmal zu generieren, egal ob der erste Versuch erfolgreich war oder nicht. Der force-Befehl erwartet als erstes Argument die aufzurufende Methode (momentan make, test oder install) und erzwingt so eine erneute Ausführung des Befehls.
Beispiel:
cpan> install OpenGL OpenGL is up to date. cpan> force install OpenGL Running make OpenGL-0.4/ OpenGL-0.4/COPYRIGHT [...]
Ein clean-Befehl führt zur Ausführung eines
make clean
im Arbeitsverzeichnis der Distributionsdatei.
Look lädt und entpackt (mit tar) die Distributionsdatei (falls das noch nicht geschehen ist), wechselt in das entsprechende Verzeichnis und öffnet einen Subshell-Prozeß in diesem Verzeichnis.
^C drücken, um zum cpan-Shellprompt zurückzukehren. Mit SIGTERM wird die cpan-Shell aufgeräumt und verlassen. Sie können den Effekt eines SIGTERM durch Senden zweier aufeinanderfolgender SIGINTs emulieren, d.h. durch zweimaliges Drücken von ^C.
CPAN.pm ignoriert SIGPIPE. Legt der Benutzer einen inactivity_timeout fest, wird während des Laufs eines perl Makefile.PL-Subprozesses ein SIGALRM verwendet.
autobundle schreibt eine Bundle-Datei in das Verzeichnis $CPAN::Config->{cpan_home}/Bundle. Die Datei enthält eine Liste aller Module, die über CPAN verfügbar und momentan in @INC installiert sind. Der Name der Bundle-Datei basiert auf dem aktuellen Datum und einem Zähler.
recompile() ist ein sehr spezieller Befehl. Er verlangt keine Argumente und führt den make/test/install-Zyklus für alle installierten dynamisch ladbaren Erweiterungen (XS-Module) mit aktivem 'force' aus. Der primäre Zweck dieses Befehls ist der Abschluß einer Netzwerkinstallation. Stellen Sie sich vor, Sie besitzen einen gemeinsamen Quellbaum für zwei unterschiedliche Architekturen. Sie entscheiden sich für eine vollständig voneinander unabhängige Neuinstallation. Sie beginnen auf einer Architektur mit Hilfe einer früher erzeugten Bundle-Datei. CPAN installiert das gesamte Bundle für Sie, aber beim zweiten Versuch für die andere Architektur antwortet CPAN bei allen Modulen mit "Foo up to date". Sie rufen dann CPANs recompile für die zweite Architektur auf und sind damit fertig.
Eine weitere beliebte Anwendung für recompile besteht darin, als Rettungsanker zu fungieren, wenn Ihr Perl mit der Binärkompatibilität bricht. Wenn eines der von CPAN.pm selbst verwendeten Module von der binären Kompatibilität abhängt (was bedeutet, daß Sie keine CPAN-Befehle ausführen können), sollten Sie zu Wiederherstellungszwecken das CPAN::Nox-Modul verwenden.
CPAN::*-Klassen: Author, Bundle, Module, Distribution
Namensraum Klasse
Slashes ("/") enthaltende Wörter Distribution
Mit Bundle:: beginnende Wörter Bundle
Alles andere Module oder Author
Module kennen die mit ihnen assoziierten Distributionsobjekte. Sie verweisen immer auf die neueste offizielle Release. Entwickler können ihre Releases als instabile Entwicklungsversionen kennzeichnen (indem sie einen Unterstrich in die sichtbare Versionsnummer einfügen), weshalb die allerneueste Distributionsdatei nicht unbedingt der Standarddistribution entspricht. Geistert im CPAN das Modul Foo in den Versionen 1.23 und 1.23_90 herum, bietet CPAN.pm eine bequeme Möglichkeit an, die Version 1.23 zu installieren:
install Foo
Das würde die vollständige Distributionsdatei (etwa BAR/Foo-1.23.tar.gz) mit allem zugehörigen Material installieren. Möchten Sie hingegen die Version 1.23_90 installieren, müssen Sie wissen, an welcher Stelle des CPAN (und zwar relativ zum Verzeichnis authors/id/) diese Datei liegt. Heißt der Autor BAR, könnte dies BAR/Foo-1.23_90.tar.gz sein, d.h., Sie müßten folgendes eingeben:
install BAR/Foo-1.23_90.tar.gz
Das erste Beispiel kann über ein Objekt der Klasse CPAN::Module gesteuert werden, das zweite durch ein Objekt der Klasse CPAN::Distribution.
CPAN::Shell->install(...)), aber auch als Funktionen im aufrufenden Paket (install(...)) nutzen.
Augenblicklich gibt es nur eine Klasse mit einer stabilen Schnittstelle - CPAN::Shell. Alle Befehle, die in der CPAN-Shell bereitstehen, sind Methoden der Klasse CPAN::Shell. Alle Befehle, die Listings von Modulen erzeugen (r, autobundle, u), geben eine Liste mit den IDs aller Module innerhalb der Liste zurück.
CPAN::Shell->expand("Module",@things) in die entsprechenden realen Objekte umgewandelt werden können. expand liefert eine Liste der CPAN::Module-Objekte zurück, die dem als Argument übergebenen @things-Array entspricht. Im Skalarkontext wird nur das erste Element der Liste zurückgegeben.
# Aktualisierung aller veralteten Dinge auf der Platte.
perl -MCPAN -e 'CPAN::Shell->install(CPAN::Shell->r)'
# Installation der Lieblingsprogramme (wenn nötig)
for $mod (qw(Net::FTP MD5 Data::Dumper)){
my $obj = CPAN::Shell->expand('Module',$mod);
$obj->install;
}
# Ausgabe alle Module der Platte ohne Versionsnummer
for $mod (CPAN::Shell->expand("Module","/./")){
next unless $mod->inst_file;
# MakeMaker-Konvention für undefinierte $Version:
next unless $mod->inst_version eq "undef";
print "No Version in ", $mod->id, "\n";
}
build_dir löscht, sobald die Größe aller Verzeichnisse die Größe von $CPAN::Config->{build_cache} (in MB) übersteigt. Der Inhalt des Caches kann für spätere Reinstallationen genutzt werden, die Sie manuell durchführen wollen. CPAN selbst verläßt sich nie auf den Inhalt des Caches. Das liegt daran, daß der Benutzer diese Verzeichnisse zur Generierung von Modulen auf unterschiedlichen Architekturen verwenden könnte.
Es gibt ein anderes Verzeichnis ($CPAN::Config->{keep_source_where}), in dem die Original-Distributionsdateien vorgehalten werden. Dieses Verzeichnis wird vom Cache-Manager nicht beachtet und muß vom Benutzer kontrolliert werden. Verwenden Sie das gleiche Verzeichnis für build_dir und keep_source_where, werden Ihre Quellen mit dem gleichen FIFO-Mechanismus gelöscht.
Es beginnt wie ein Perl-Modul mit einer Paket-Deklaration und einer $VERSION-Variable. Danach sieht der pod-Abschnitt aus wie jeder andere pod-Abschnitt auch, mit dem Unterschied, daß es einen speziellen pod-Abschnitt gibt, der wie folgt beginnt:
=head1 CONTENTS
In diesem pod-Abschnitt folgt jede Zeile dem folgenden Format:
Modul_Name [VERSIONs_String] [- optionaler Text]
Nur das erste Feld, also der Name des Moduls, wird verlangt (z.B. Foo::Bar, nicht der Name der Distributionsdatei). Der Rest der Zeile ist optional. Der Kommentarteil wird genau wie die Überschrift einer Manpage durch einen Bindestrich getrennt.
Die Distribution eines Bundles muß den gleichen Konventionen folgen wie andere Distributionen.
Bundles werden im CPAN-Paket gesondert behandelt. Geben Sie beispielsweise 'install Bundle::Tkkit' ein (vorausgesetzt ein solches Bundle existiert), installiert CPAN alle Module im CONTENTS-Abschnitt des Pods. Sie können eigene Bundles lokal installieren, indem Sie eine entsprechend konforme Bundle-Datei an irgendeiner Stelle Ihres @INC-Pfades aufnehmen. Der über die Shell-Schnittstelle verfügbare autobundle()-Befehl macht das für Sie, indem er alle momentan installierten Module in einer Bundle-Datei zusammenfaßt.
ftp:-URL besitzt.
Besitzen Sie weder Net::FTP noch LWP, greift ein einfacher Fallback-Mechanismus auf einen externen FTP- oder lynx-Befehl zurück.
$VERSION-Variable in einer einfach zu parsenden Form definieren. Diese Voraussetzung kann kaum gelockert werden, da es bei weitem zuviel Speicher kosten würde, alle Pakete in das laufende Programm zu laden, nur um die $VERSION zu ermitteln. Augenblicklich funktionieren alle mit Versionen arbeitenden Programme etwa so:
perl -MExtUtils::MakeMaker -le \
'print MM->parse_version(shift)' filename
Wenn Sie sich als Autor eines Pakets fragen, ob Ihre $VERSION verarbeitet werden kann, probieren Sie es bitte mit der obigen Methode aus.
Im interaktiven Modus können Sie "o debug" versuchen, was die zum Debugging vorhandenen Optionen innerhalb der einzelnen Teile des Pakets ausgibt. Die Ausgabe ist für Sie möglicherweise nicht besonders nützlich, weil es sich dabei um ein Nebenprodukt meiner eigenen Tests handelt. Wenn Sie aber eine Idee haben, welcher Teil des Pakets einen Bug hat, versuchen Sie es einfach und schicken Sie mir weiterführende Informationen. Sie sollten wissen, daß bei "o debug" die Komplettierung unterstützt wird.
use()- oder require()-Anweisungen zum Zuge kommen.
Momentan sind die folgenden Schlüssel in der Hashreferenz $CPAN::Config definiert:
build_cache Größe des Caches zur Generierung von Modulen
build_dir Lokal erreichbares Verzeichnis zur Generierung von Modulen
index_expire Legt fest, nach wie vielen Tagen die Indexdateien erneut einzulesen sind.
cpan_home Für dieses Paket lokal reserviertes Verzeichnis
gzip Position des externen gzip-Programms
inactivity_timeout Bricht interaktive Makefile.PLs nach dieser Anzahl inaktiver Sekunden ab.
Setzen Sie diesen Wert auf 0, um niemals abzubrechen.
inhibit_startup_message
Auf wahr gesetzt, wird keine Startup-Meldung ausgegeben.
keep_source Quellen in einem lokalen Verzeichnis vorhalten?
keep_source_where Verzeichnis, in dem wir Quellen ablegen (wenn wir das tun)
make Position des externen make-Programms
make_arg Argumente, die immer an 'make' übergeben werden sollen
make_install_arg Wie make_arg, aber für 'make install'
makepl_arg Argumente, die an 'perl Makefile.PL' übergeben werden
pager Position des externen Programms more (oder eines anderen Pagers)
tar Position des externen Programms tar
unzip Position des externen Programms unzip
urllist arrayref auf nahe CPAN-Sites (oder vergleichbare Orte)
wait_list arrayref auf einen zu versuchenden wait-Server (siehe CPAN::WAIT)
Sie können jede dieser Optionen interaktiv in der cpan-Shell setzen und abfragen. Hierzu können Sie die in o conf definierten Befehle verwenden:
urllist-Parameter der Konfigurationstabelle enthält eine Liste von URLs, die zum Download verwendet werden können. Enthält die Liste irgendwelche file-URLs, versucht CPAN immer, Dateien zuerst über diese URLs herunterzuladen. Dieses Feature ist bei Indexdateien deaktiviert. Die Empfehlung an die Besitzer einer CD-ROM-Version des CPAN lautet: Nehmen Sie ihre lokale, möglicherweise veraltete CD-ROM als file-URL am Ende der urllist auf, z.B.:
o conf urllist push file://localhost/CDROM/CPAN
CPAN.pm lädt dann die Indexdateien von einer der am Anfang der urllist stehenden CPAN-Sites herunter. Später wird dann für jedes Modul geprüft, ob eine lokale Kopie der neuesten Version vorliegt.
Eine weitere Eigentümlichkeit von urllist besteht darin, daß die Site, über die wir die letzte Datei erfolgreich herunterladen konnten, automatisch mit einer Präferenz versehen wird. Bei der nächsten Anforderung wird diese Site dann als erstes probiert. Wenn Sie zur Laufzeit also eine neue Site hinzufügen, kann es vorkommen, daß die vorher präferierte Site erneut angesprochen wird. Soll eine Site für den nächsten Transfer ausgeschlossen werden, müssen Sie diese explizit aus der urllist entfernen.
Die zukünftige Entwicklung sollte in Richtung einer besseren Integration der anderen Teile geführt werden.
Verlangt ein Makefile.PL spezielle Anpassungen von Bibliotheken, oder fragt es Benutzer nach speziellen Eingaben etc., dann ist CPAN möglicherweise nicht in der Lage, die Distribution zu erzeugen. In diesem Fall sollten Sie auf die traditionelle Methode zurückgreifen, ein Perl-Modul-Paket von der Shell aus zu erzeugen.
perl(1), CPAN::Nox(3)