Alle Mann an die Pumpen! (Linux-Magazin, Oktober 97)

Faulheit und Ungeduld, ihr herausragenden Tugenden wahrhaft großer Programmierer! Euch werde ich in Zukunft huldigen - denn ab jetzt wird kopiert statt entwickelt! Oft lohnt sich, statt selbst an einem Perl-Problem herumzubasteln, ein Blick aufs CPAN. So ist das Ziel dieser neuen Artikelreihe, jeden Monat neue Perl-Anwendungen vorzustellen, die sich schamlos aus dem CPAN-Fundus bedienen. Heute gibt's nicht nur eine Einführung in die Architektur des CPAN, sondern auch noch eine Bedienungsanleitung für das Modul CPAN.pm - den raffinierten CPAN-Saugrüssel.

Auf dem Comprehensive Perl Archive Network stellen engagierte Perl-Programmierer ihre wiederverwendbaren Entwicklungen der Allgemeinheit zur Verfügung. Da kein einzelner Server technisch in der Lage wäre, die Modulwünsche sämtlicher Perl-Anhänger weltweit zu befriedigen, lagern die Module des CPAN auf dutzenden gespiegelter Rechner.

Woher nehmen?

Welcher CPAN-Server ist der nächste? Ein handelsüblicher Browser bringt es an den Tag: Der CPAN-Dispatcher von Tom Christiansen

    http://www.perl.com/CPAN

präsentiert eine Liste verschiedener CPAN-Spiegel mit derzeit zwei Servern aus deutschen Landen:

    ftp://ftp.gmd.de/packages/CPAN
    ftp://ftp.uni-hamburg.de/pub/soft/lang/perl/CPAN

Eine einmal getroffene Wahl legt der Dispatcher in einem Cookie ab, das der benutzte Browser speichert. Eine nachfolgende Anfrage nach einer Datei unterhalb des Verzeichnisses http://www.perl.com/CPAN/ leitet der Dispatcher automatisch zum gewählten CPAN-Spiegel um: Aus der Anfrage

    http://www.perl.com/CPAN/CPAN.html

nach dem CPAN-Einführungsdokument wird so flugs

    ftp://ftp.gmd.de/packages/CPAN/CPAN.html

und (fast) keine unnötigen Byteströme jagen durch den Atlantik.

Natürlich dürfen die CPAN FTP-Server auch traditionell über eine anonymous-FTP-Verbindung angepumpt werden. Die Übernahme des nächstgelegenen CPAN-URL in die 'Bookmark'-/'Favorites'-Liste eines WWW-Browsers ist jedoch auf Dauer komfortabler.

Das CPAN enthält zunächst einmal die neuesten Distributionen des Perl-Interpreters perl selbst. Weiter steht eine Vielzahl von Modulen zur freien Verfügung. Abbildung 1 zeigt anhand der Perl-Distribution perl5.004_02.tar.gz und des Moduls CPAN-1.29.tar.gz ausgewählte Zugriffspfade unterhalb des CPAN-Verzeichnisses jedes CPAN-Servers.

Abb.1: Ausgewählte Zugriffspfade innerhalb des CPAN

So liegt, wie aus dem untersten Pfad von Abbildung 1 hervorgeht, die aktuellste Perl-Version (immer) unter src/latest.tar.gz oder (derzeit) src/5.0/perl5.004_02.tar.gz zur Abholung bereit.

Das im Aufmacher hochgejubelte und weiter unten beschriebene Modul CPAN.pm von Andreas König findet sich in der aktuellsten Version CPAN-1.29.tar.gz in folgenden Verzeichnissen:

Folgende Dateien führen den Benutzer durch das CPAN:

ROADMAP.html
gibt eine Übersicht der nachfolgend beschriebenen (und weiterer) Dokumente. Hat man vergessen, wo das ein oder andere Dokument liegt, ist hier der richtige Einstiegspunkt.

CPAN.html
bietet eine detaillierte Einführung in die CPAN-Organisation und führt die verfügbaren Module auf. Das Hauptdokument der CPAN, ideal, um einen Einstieg zu finden.

modules/00modlist.long.html
ist die (auch über die Newsgroup comp.lang.perl.misc verteilte) Aufstellung sämtlicher über das CPAN verfügbaren Perl-Module. Hier finden sich auch nützliche Tips zur Entwicklung eigener Module.

Automatisch Aufrüsten

Dank des unermüdlichen Schaffensdrangs der CPAN-Entwickler entstehen ständig neue Perl-Module. Die muß der gestreßte Systemadministrator nicht nur installieren, sondern auch auf dem neuesten Stand halten. Hier winkt Abhilfe: Das letzte, noch von Hand installierte Modul heißt CPAN.pm - danach geht alles automatisch.

Ein typisches Beispiel: In einer Fachzeitschrift steht ein interessantes Perl-Skript, das für WWW-Zugriffe

    use LWP::UserAgent;

verwendet. Doch statt erhoffter Webseiten spuckt das Skript lediglich eine Fehlermeldung aus:

  Can't locate LWP::UserAgent.pm in @INC at ./t line 3.
  BEGIN failed--compilation aborted at ./t line 3.

Klarer Fall: Das Modul fehlt dem heimischen Rechner. Zweifellos läßt es sich vom CPAN laden - doch von wo genau?

Vorausgesetzt, das Modul CPAN.pm von Andreas König ist fachgerecht installiert (siehe Kasten ``Nur noch dieses eine Mal ...''), geht das automatisch. Der Aufruf

    perl -MCPAN -e shell

bringt einen Kommandozeilen-Interpreter zum Vorschein, der auf die Anfrage

    cpan> i /agent/

eine ganze Reihe von Treffern als eine Liste von Kurz-Beschreibungen ausgibt:

    Author          AGENTML (Mailing List For Perl5 Agents)
    Distribution    JDUNCAN/Agent-2.91.tar.gz
    Module          Agent           (JDUNCAN/Agent-2.91.tar.gz)
    Module          LWP::UserAgent  
    Module          RPC::Simple::Agent (DDUMONT/RPC-Simple-0.1.tar.gz)

Die explizite Suche nach dem Modul LWP::UserAgent

    cpan> i LWP::UserAgent

hilft mit detaillierten Informationen weiter:

    Module id = LWP::UserAgent
        DESCRIPTION  A WWW UserAgent class
        CPAN_USERID  GAAS (Gisle Aas)
        CPAN_FILE    GAAS/libwww-perl-5.10.tar.gz
        DSLI_STATUS  RmpO (released,mailing-list,perl,object-oriented)
        INST_FILE    (not installed)

Demnach ist LWP::UserAgent Bestandteil des libwww-Bundles von Gisle Aas, dessen aktuellste Version 5.10 auf dem CPAN liegt. Zur Installation (diese erfordert auf den meisten Systemen root-Rechte, im Zweifelsfall also die Shell mit 'q' verlassen und als root nochmal starten) tippt man nun

    cpan> install LWP::UserAgent

und die CPAN-Shell prüft, ob eventuell schon eine Version von LWP::UserAgent vorliegt und installiert, falls diese veraltet ist oder gar noch gänzlich fehlt, den neuesten libwww-Bundle auf dem Rechner. Hierzu lädt sie die Distribution vom eingestellten CPAN-Spiegel, entpackt diese, führt perl Makefile.PL, make, make test und make install aus - und schon ist das Modul verfügbar.

Dabei vermeidet CPAN.pm unnötige Arbeit. Ein anschließender Versuch, das Modul LWP::Simple aus der gleichen Distribution zu installieren, bricht die CPAN-Shell beispielsweise bereits im Ansatz ab, da LWP::Simple bereits in der neuesten Version vorliegt:

    cpan> install LWP::Simple
    LWP::Simple is up to date.

Hingegen erzwingt

    cpan> force install LWP::Simple

den Installationsprozeß, egal, ob er nötig wäre oder nicht.

Informationen zu CPAN-Autoren erhält man entweder mittels eines regulären Ausdrucks

    cpan> a /andreas/
    Author id = ANDK
        EMAIL        a.koenig@franz.ww.TU-Berlin.DE
        FULLNAME     Andreas König

oder, falls das CPAN-Kürzel des Entwicklers bekannt ist, mit

    cpan> a MSCHILLI
    Author id = MSCHILLI
        EMAIL        mschilli@blacksun.com
        FULLNAME     Michael Schilli

Um unnötigen Netzverkehr zu vermeiden, hält CPAN.pm einen Cache fest eingestellter Maximalgröße mit bereits geholten Distributionen und Textdateien auf der Festplatte vor. Nur falls letztere sich als zu alt erweisen, erfolgt der Transfer vom CPAN-Server.

Dieses Verzeichnis legt die Installationsroutine von CPAN.pm fest, der Standardwert ist .cpan im Home-Verzeichnis des installierenden Benutzers. Dort legt CPAN.pm im Verzeichnis sources einen kleinen lokalen CPAN-Spiegel an: Aktuelle Kopien der 'maschinenlesbaren' CPAN-Übersichtsdateien 01mailrc.gz, 02packag.gz und 03mlist.gz finden sich hier. Im Verzeichnis authors/id darunter liegen unter den Autoren-Kürzeln die originalen komprimiert-ge'tar'ten Distributionen. .cpan/build beherbergt die entpackten und eventuell bereits zur Installation vorbereiteten Builds.

Kasten: ``Nur noch dieses eine Mal ...''

Die im Artikel beschriebene CPAN-Shell benötigt das Modul CPAN.pm.

Dies ist ein guter Zeitpunkt, um über einen Upgrade auf perl 5.004 nachzudenken. Nicht nur bietet dieser Release ausgezeichnete Stabilität, sondern enthält auch bereits das CPAN.pm-Modul. Alle früheren Perl5-Versionen verlangen, die CPAN-1.29.tar.gz-Distribution von der CPAN (Verzeichnis modules/by-module/CPAN) zu holen und den bekannten Installationsprozeß von Hand durchzuführen:

    tar zxfv CPAN-1.29.tar.gz
    cd CPAN-1.29
    perl Makefile.PL
    make 
    make install

Das Kommando make install setzt, falls die Perl-Installation wie üblich im System-Bereich liegt, root-Rechte voraus. Damit CPAN.pm Dateien von den meist auf FTP-Servern liegenden CPAN-Distributionen übertragen kann, benötigt es Net::Ftp oder eine Installation des Ascii-Browsers lynx. Für Nicht-Unix Systeme oder für den Fall, daß der nächstgelegene CPAN-Server kein FTP-Protokoll fährt, sind einige LWP-Module aus der libwww notwendig.

Stolze perl5.004-Besitzer stellen nur sicher, daß sie aufs Internet zugreifen können (sonst versucht CPAN.pm mit den wildesten Tricks Netzzugriffe, die alle fehlschlagen) und gelangen mit

    perl -MCPAN -e shell

zum Installationsdialog, den von Hand Installierende nach dem Aufruf von perl Makefile.PL präsentiert bekommen. Die Fragen lassen sich meist schlicht mit einem Druck auf die Return-Taste beantworten. Bei der Frage nach dem nächstgelegenen CPAN-Rechner stellt CPAN-1.29 eine Liste zur Auswahl zur Verfügung, während das der Standard-Distribution beiligende CPAN-1.24 lediglich einen URL wissen will (ftp://ftp.gmd.de/packages/CPAN oder ftp://ftp.uni-hamburg.de/pub/soft/lang/perl/CPAN sind eine gute Wahl).

Läuft die CPAN-Shell einmal, lädt

    cpan> install Bundle::CPAN

zur Steigerung des Bedienungskomforts zusätzliche Module (z.B. Term::Readline für den Kommandozeilen-Editor) von der CPAN und installiert sie.

Michael Schilli

arbeitet als Software-Engineer bei Yahoo! in Sunnyvale, Kalifornien. Er hat "Goto Perl 5" (deutsch) und "Perl Power" (englisch) für Addison-Wesley geschrieben und ist unter mschilli@perlmeister.com zu erreichen. Seine Homepage: http://perlmeister.com.