Was ist cpanm?

Das Werkzeug cpanm ist dazu da, Module zu installieren. In diesem Artikel gebe ich dir eine kurze Einführung in seine Benutzung. Ich zeige dir die häufigsten Anwendungsfälle und gebe dir Hinweise darauf, wo du weitere Informationen nachlesen kannst.

Wie installiere ich ein Modul?

Da dies der häufigste Fall ist, wozu Anwender das Werkzeug benutzen, ist dies der einfachste: Du rufst das Werkzeug in der Shell auf und übergibst ihm den Namen des zu installierenden Moduls als Argument:


> cpanm Test::Spec

Wenn du bereits die aktuelle Version installiert hast, dann wird cpanm es nicht erneut installieren, sondern dich auf diesen Umstand hinweisen:


$ cpanm Test::Spec
Test::Spec is up to date. (0.51)

Wenn auf CPAN eine neuere Version verfügbar ist, dann wird es von dort installiert. Die Ausgabe sollte dann in etwa wie folgt aussehen:


--> Working on Test::Spec
Fetching http://www.cpan.org/authors/id/A/AN/ANDYJONES/Test-Spec-0.51.tar.gz ... OK
Configuring Test-Spec-0.51 ... OK
Building and testing Test-Spec-0.51 ... OK
Successfully installed Test-Spec-0.51
1 distribution installed

Die erste Zeile zeigt dir, an welchem Modul gerade gearbeitet wird.

In der zweiten Zeile wird dir gesagt, woher das Modul geholt wird. An der URL kannst du erkennen, dass der Autor »ANDYJONES« heißt und das Modul in der Version 0.51 gefunden wurde.

Zeile drei sagt dir, dass das Modul konfiguriert wird. In diesem Schritt werden die Grundlagen dafür geschaffen, dass das Modul installiert und danach von dir verwendet werden kann. Was dort genau passiert, hängt vom Modul ab; hier wird beispielsweise dem Modul mitgeteilt, wohin es installiert werden soll.

Im nächsten Schritt wird das Modul dann gebaut. Daran schließt sich dann das Ausführen der automatisierten Tests an. Wenn hier keine Fehler gefunden wurden, installiert »cpanm« das Modul. Ab jetzt kannst du es verwenden.

Gib dies in die Shell ein:

perl -MTest::Spec

Mit dieser Eingabe startest du perl und sagst ihm über die Option »-M«, dass es das genannte Modul laden soll.

Wenn das Modul installiert wurde, dann sollte bei dir nun nichts in der Shell stehen. Warum? Weil du kein Programm aufgerufen hast, gibt es außer dem Laden des Moduls nichts zu tun.

Wenn das Modul nicht installiert werden konnte, dann wirst du etwa folgende Ausgabe sehen:

Can't locate Test/Spec.pm in @INC (you may need to install the Test::Spec module) (@INC contains: <lange Liste von Verzeichnissen>).
BEGIN failed--compilation aborted.

Diese Ausgabe zeigt dir, dass das Modul nicht gefunden werden konnte. Die lange Liste von Verzeichnissen am Ende der Zeile sagt dir, wo perl das Modul überall gesucht hat. (Diese Ausgabe wird deine Shell typischerweise umbrechen, so dass einige Verzeichnisnamen vielleicht zerhackt ausgegeben werden.)

Wenn ein Modul nicht gefunden werden konnte, hat dies üblicherweise folgende Ursachen: Das Modul ist überhaupt nicht installiert; das Modul ist so installiert, dass perl es nicht finden kann; oder der Name des Moduls ist falsch geschrieben.

Wenn beim Installieren ein Fehler auftritt, dann sieht das Ende der Ausgabe in etwa so aus:

[…]
Building and testing Test-Spec-0.51 ... FAIL
! Installing Test::Spec failed. See /Users/glauschwuffel/.cpanm/work/1502421669.12679/build.log for details. Retry with --force to force install it.

In der letzten Zeile nennt cpanm den Pfad zum Protokoll, das es während der Installation geschrieben hat. In dieser Textdatei kannst du nachlesen, was genau bei der Installation nicht geklappt hat. In der Regel wird ein Test fehlgeschlagen sein. Hier ein Auszug aus dem Protokoll einer fehlgeschlagenen Installation des Moduls App::perlbrew:

# curl = /Users/glauschwuffel/.cpanm/work/1502421669.12679/App-perlbrew-0.80/t/fake-bin/curl
[ERROR] Cannot find a proper http user agent program. Please install curl or wget.
# Tests were run but no plan was declared and done_testing() was not seen.
# Looks like your test exited with 2 just after 1.
t/http-ua-detect-non-curl.t ............ 
Dubious, test returned 2 (wstat 512, 0x200)
All 1 subtests passed 
t/http-ua-detect.t ..................... ok
t/http.t ............................... skipped: (no reason given)
t/installation-perlbrew.t .............. ok
t/installation.t ....................... ok
t/installation2.t ...................... ok
t/installation3.t ...................... ok
t/unit-files-are-the-same.t ............ ok

Test Summary Report
-------------------
t/http-ua-detect-non-curl.t          (Wstat: 512 Tests: 1 Failed: 0)
  Non-zero exit status: 2
  Parse errors: No plan found in TAP output
Files=51, Tests=433,  9 wallclock secs ( 0.21 usr  0.10 sys +  6.48 cusr  0.97 csys =  7.76 CPU)
Result: FAIL
Failed 1/51 test programs. 0/433 subtests failed.
make: *** [test_dynamic] Error 255
-> FAIL Installing App::perlbrew failed. See /Users/glauschwuffel/.cpanm/work/1502421669.12679/build.log for details. Retry with --force to force install it.

Das ist jetzt vielleicht etwas viel Text auf einmal, aber da kann ich dich beruhigen: Das meiste kannst du ignorieren. Das Problem bei diesen Installationsprotokollen ist, herauszufinden, welche Zeilen du nicht ignorieren kannst.

In diesem Fall ist die zweite Zeile interessant, denn da steht die Fehlermeldung: Der Test hat das Programm »curl« nicht gefunden. Alle folgenden Zeilen sind nur Rauschen, die du ignorieren kannst. Die letzte Zeile sollte dich allerdings an die Zeile erinnern, die dir cpanm in der Shell ausgegeben hat: Die Installation schlug fehl.

Den Fehler bei der Installation musst du dann untersuchen und manchmal etwas herumexperimentieren. Gelegentlich kann man den Fehler selbst beheben, manchmal ist es aber auch einfach so, dass das Modul in der vorliegenden Version auf deinem Rechner in der Umgebung nicht funktioniert. Es kommt aber auch oft genug vor, dass sich ein Installationsfehler beheben lässt.

Weitere Installationsquellen

Cpanm kann Module nicht nur vom CPAN installieren, sondern aus einer Reihe von Quellen:

  • lokal aus einem Archiv: cpanm Archivname

  • aus einem git-Repo: cpanm Repo-URL

  • aus einem Verzeichnis, in dem die Modulquellen liegen: cpanm ..

Weitere Installationsarten, die du am Anfang noch nicht brauchen wirst, werden dir angezeigt, wenn du cpanm --help aufrufst.

Wie installiere ich Abhängigkeiten?

Wenn ein Modul andere Module per use oder require einbindet, dann müssen diese ebenfalls installiert sein, damit das Modul funktionieren kann. Deshalb installiert cpanm die benötigten Module vor der Installation des eigentlichen Moduls, das du installieren möchtest. Da diese Module wiederum Abhängigkeiten haben können, müssen hierfür auch wieder Module installiert werden, und für die Module dann auch wieder Module …

Du erkennst hoffentlich ein Muster.

Diese Installation von benötigten Modulen kann etwas dauern. Gerade bei einer frischen Perl-Installation, in der du noch nicht besonders viele Perl-Module nachinstalliert hast, wirst du etwas warten müssen. Cpanm behandelt die Abhängigkeiten aber zuverlässig und installiert nach und nach die notwendigen Module.

Wenn du eine Anwendung schreibst, dann braucht sie mit Sicherheit auch Module. Auch diese kann cpanm installieren, da dies im Prinzip nichts anderes ist als die Installation von Modulen, die ein Modul benötigt. Das Werkzeug muss nur wissen, welche Module es installieren soll. Und genau das wird in der Datei cpanfile angegeben.

Hier ein kurzes Beispiel einer solchen Datei, in der drei Module aufgeführt werden:

requires "Data::UUID";
requires "Digest::SHA";
requires "Dist::Zilla";

Der Aufruf von cpanm --installdeps . installiert dann die Module, die dort aufgeführt sind. Weiteres über den Aufbau der Datei cpanfile findest du in der Dokumentation über das cpanfile-Format.

Wo kann ich mehr nachlesen?

Ich habe dir in diesem Artikel gezeigt, wie du Module und dessen Abhängigkeiten mit cpanm installierst. Dabei konnte ich die Benutzung des Werkzeugs nur anreißen, es kann noch viel mehr. Die Anleitung von cpanm zeigt dir, was noch alles möglich ist.

Wenn du etwas darüber wissen möchtest, wie du programmatisch an die Abhängigkeiten von Modulen herankommst, empfehle ich dir einen Artikel von Gabor Szabo dazu.

comments powered by Disqus