Name

CPAN - Abfrage, Download und Generierung von Perl-Modulen von CPAN-Sites


Übersicht

Interaktiver Modus:

perl -MCPAN -e shell;

Batch-Modus (Stapelverarbeitung):

use CPAN;

autobundle, clean, install, make, recompile, test


Beschreibung

Das CPAN-Modul wurde entwickelt, um das make und install von Perl-Modulen und -Erweiterungen zu automatisieren. Es verfügt über einige Suchfähigkeiten und weiß, wie Net::FTP bzw. LWP (oder lynx bzw. ein externer FTP-Client) verwendet werden können, um die Rohdaten aus dem Netz herunterzuladen.

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.


Interaktiver Modus

Den interaktiven Modus starten Sie durch Eingabe von

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:

Suche nach Autoren, Bundles, Distributionsdateien und Modulen
Es gibt für jede dieser Kategorien einen entsprechenden Befehl 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)

make, test, install, clean von Modulen oder Distributionen
Diese Befehle benötigen eine Reihe von Argumenten und ermitteln, was zu tun ist, um die gewünschte Aktion durchzuführen. Handelt es sich beim Argument um den Namen einer Distributionsdatei (was durch eingebettete Slashes erkannt wird), wird diese verarbeitet. Handelt es sich um ein Modul, ermittelt CPAN die Distributionsdatei, in der dieses Modul enthalten ist, und verarbeitet sie dann.

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.

readme und look
Diese beiden Befehle erwarten als einziges Argument ein Modul oder eine Distributionsdatei. readme gibt die an die Distributionsdatei gekoppelte README-Datei aus. 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.

Signale
CPAN.pm installiert Signal-Handler für SIGINT und SIGTERM. Innerhalb der cpan-Shell können Sie jederzeit ^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.


CPAN::Shell

Die über die Shell-Schnittstelle verfügbaren Befehle sind Methoden des Pakets CPAN::Shell. Bei der Eingabe eines Shell-Befehls wird diese mit Text::ParseWords::shellwords() zerlegt. Diese Routine verhält sich so wie die meisten anderen Shells auch. Das erste Wort wird als die aufzurufende Methode interpretiert, und die restlichen Wörter werden als Argumente dieser Methode betrachtet. Eingaben über mehrere Zeilen hinweg sind möglich, indem Sie einen literalen Backslash ans Zeilenende anhängen.


autobundle

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

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.


Die vier CPAN::*-Klassen: Author, Bundle, Module, Distribution

Obwohl sie als Interna betrachtet werden könnte, ist die Klassenhierarchie für Benutzer und Programmierer von Bedeutung. CPAN.pm arbeitet mit den vier obengenannten Klassen, und alle teilen sich eine Gruppe von Methoden. Das gilt als ein klassischer, einfacher Polymorphismus. Ein Metaklassenobjekt registriert Objekte aller Art und indiziert sie mit einem String. Die Objekte referenzierenden Strings besitzen einen separaten Namensraum (nun, nicht vollständig separat):

         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.


Programmierschnittstelle

Wenn Sie nicht die Shell nutzen, können Sie die Shell-Befehle als Methoden (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.

expand($type,@things)
Die IDs aller innerhalb eines Programms verfügbaren Objekte sind Strings, die mit der Methode 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.

Programmierbeispiele
Diese Programmierung ermöglicht dem Entwickler die Durchführung von Operationen, die die Fähigkeiten der Shell kombinieren.

# 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";
}


Methoden


Cache-Manager

Momentan überwacht der Cache-Manager nur das Build-Verzeichnis ($CPAN::Config->{build_dir}). Verwendet wird ein simpler FIFO-Mechanismus, der vollständige Verzeichnisse unterhalb von 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.


Bundles

Ein Bundle ist einfach ein Perl-Modul im Bundle::-Namensraum, das keinerlei Funktionen oder Methoden definiert. Es enthält üblicherweise nur Dokumentation.

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.


Voraussetzungen

Wenn Sie einen lokalen CPAN-Mirror besitzen und auf alle Dateien mit "file:"-URLs zugreifen können, benötigen Sie Perl ab Version 5.003, um dieses Modul verwenden zu können. Anderenfalls wird Net::FTP dringendst empfohlen. LWP könnte bei Nicht-UNIX-Systemen notwendig sein oder wenn die nächstgelegene CPAN-Site keinen ftp:-URL besitzt.

Besitzen Sie weder Net::FTP noch LWP, greift ein einfacher Fallback-Mechanismus auf einen externen FTP- oder lynx-Befehl zurück.


Pakete und Versionen finden

Dieses Modul setzt voraus, daß alle Pakete im CPAN


Debugging

Das Debugging dieses Moduls gestaltet sich recht schwierig, weil Interferenzen von den unterschiedlichsten Seiten einwirken: der Software, die die CPAN-Indizes erstellt, dem Mirroring-Prozeß im CPAN, dem Packaging, der Konfiguration, der Synchronität und den Bugs in CPAN.pm.

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.


Floppy, Zip und Jazz

CPAN.pm funktioniert auch ohne Netzwerk wunderbar. Wenn Sie nicht-vernetzte Maschinen pflegen, sollten Sie die Nutzung von URLs in Betracht ziehen. Natürlich müssen Sie Ihre Module erst einmal irgendwoher bekommen. Sie könnten also CPAN.pm auf einer vernetzten Maschine nutzen, um alles Notwendige herunterzuladen. Dann kopieren Sie das Verzeichnis $CPAN::Config->{keep_source_where} (nicht aber $CPAN::Config->{build_dir}) auf eine Floppy. Diese Floppy ist eine Art "persönliches CPAN". CPAN.pm funktioniert mit dieser Floppy auch auf einer nicht-vernetzten Maschine sehr gut.


Konfiguration

Bei der Installation des CPAN-Moduls wird eine für die gesamte Site geltende Konfigurationsdatei CPAN/Config.pm erzeugt. Die darin definierten Standardwerte können in einer anderen Konfigurationsdatei, CPAN/MyConfig.pm, überschrieben werden. Wenn Sie möchten, können Sie diese Datei auch in $HOME/.cpan/CPAN/MyConfig.pm speichern, weil $HOME/.cpan zum Suchpfad des CPAN-Moduls hinzugefügt wird, bevor 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:

o conf <scalar option>
Gibt den aktuellen Wert der scalar option aus.

o conf <scalar option> <value>
Legt den Wert der scalar option mit wert fest.

o conf <list option>
Gibt den aktuellen Wert der list option im MakeMaker-neatvalue-Format aus.

o conf <list option> [shift|pop]
shift/pop auf das Array in der list option-Variable.

o conf <list option> [unshift|push|splice] <list>
Funktioniert wie die entsprechenden Perl-Befehle.


urllist-Parameter unterstützt CD-ROMs

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


Sicherheit

CPAN.pm besitzt keine besondere Sicherheitsschicht. CPAN.pm unterstützt Sie bei der Installation fremden, unmaskierten und unsignierten Codes auf Ihrer Maschine. Es erfolgt ein Vergleich mit einer Prüfsumme, die, ebenso wie die Distributionsdatei selbst, aus dem Netz kommt. Ist es jemandem gelungen, an der Distributionsdatei herumzuspielen, könnte er sehr wohl auch die CHECKSUMS-Datei verändert haben. Die zukünftige Entwicklung geht in Richtung Starker Authentifizierung.


Export

Die meisten Funktionen im CPAN-Paket werden standardmäßig exportiert. Der Grund dafür ist, daß diese primär für die cpan-Shell bzw. für Einzeiler gedacht sind.


Bugs

Wir sollten das _gesamte_ CPAN abdecken, nicht nur den PAUSE-Teil, nicht wahr? Bei der Diskussion wurden CPAN und PAUSE eins -- aber in Wirklichkeit sind sie es nicht. PAUSE ist authors/ und modules/. CPAN ist PAUSE plus clpa/, doc/, misc/, ports/, src/ und scripts/.

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.


Version

Diese Manpage dokumentiert "CPAN.pm" in der Version CPAN-1.40


Autor

Andreas König <a.koenig@kulturbox.de>


Übersetzer

Deutsche Übersetzung von Peter Klicman, Köln
© 1998 by O'Reilly Verlag, Köln


Siehe auch

perl(1), CPAN::Nox(3)