CPAN

Aus FHEMWiki

CPAN

Das CPAN, Comprehensive Perl Archive Network, ist ein weltweit verteiltes Netzwerk für Perl-Module, das seit 1995 besteht und aktuell etwa 200 000 Module umfasst.

Siehe auch hier eine Zusammenfassung des CPAN-Projektes.

Clients

Plattformunabhängig

Das CPAN bietet drei plattformunabhängige Clients an, von denen zwei hier beschrieben werden. Die Empfehlung ist, cpanm zu nutzen.

cpanminus

cpanminus (cpanm) ist der bevorzugte Weg, wie CPAN-Pakete installiert werden sollten. cpan-minus ist, wie cpan ein CPAN-Paket, das aber auch für viele Betriebssystem als fertiges Paket portiert wurde.

cpan-minus bietet einen Quickstart an, der auf jedem System läuft, auf dem Perl installiert ist. Dazu muss folgender Befehl auf der Kommandozeile ausgeführt werden:

curl -L https://cpanmin.us | perl - App::cpanminus

Aus Sicherheitsgründen sollte vor Ausführung des Befehls überprüft werden, was unter cpanmin.us zu finden ist, da ggf. Schadcode unbemerkt eingeschmuggelt werden könnte.

Ist der Client cpanm installiert, kann mit

cpanm Paket::Name

ein Paket (in diesem Falle das nicht-existende Paket Paket::Name) installiert werden. Die Option --sudo sorgt dafür, dass cpanminus die Installation als Superuser versucht (ggf. muss ein Passwort eingegeben werden).

Exkurs: cpan-outdated

Das Paket cpan-outdated erzeugt eine cpanminus-kompatible Liste an CPAN-Paketen, die aktualisiert werden können, z.B.

$ cpan-outdated 
A/AN/ANDK/CPAN-2.27.tar.gz
L/LE/LEONT/Test-Harness-3.42.tar.gz
B/BI/BINGOS/Archive-Tar-2.36.tar.gz
T/TO/TODDR/autodie-2.32.tar.gz
R/RU/RURBAN/B-Debug-1.26.tar.gz
I/IL/ILMARI/bareword-filehandles-0.007.tar.gz
P/PJ/PJACKLAM/bignum-0.51.tar.gz
X/XS/XSAWYERX/Carp-1.50.tar.gz
L/LE/LEEJO/CGI-4.47.tar.gz
A/AT/ATOOMIC/Clone-0.45.tar.gz
M/ML/MLEHMANN/common-sense-3.75.tar.gz
P/PM/PMQS/Compress-Raw-Bzip2-2.093.tar.gz
P/PM/PMQS/Compress-Raw-Zlib-2.093.tar.gz
P/PM/PMQS/IO-Compress-2.093.tar.gz
H/HM/HMBRAND/Config-Perl-V-0.31.tgz
A/AT/ATOOMIC/TimeDate-2.33.tar.gz
P/PM/PMQS/DB_File-1.853.tar.gz
H/HU/HURRICUP/Devel-Camelcadedb-v2019.1.tar.gz
P/PJ/PJCJ/Devel-Cover-1.36.tar.gz
A/AT/ATOOMIC/Devel-PPPort-3.58.tar.gz
M/MS/MSHELOR/Digest-SHA-6.02.tar.gz
R/RJ/RJBS/Email-Sender-1.300034.tar.gz

Sehr nützlich ist die Kombination aus cpanminus und cpan-outdated:

cpan-outdated | cpanm --sudo

Diese Befehlssequenz aktualisiert alle aktualisierbaren CPAN-Pakete mit Hilfe von cpanminus (als Superuser).

cpan

cpan ist der mit jeder Perl-Installation mitgelieferte Client für das CPAN und lässt sich entweder mit

perl -MCPAN -e shell

oder

cpan

starten. Es wird ein interaktiver Client gestartet; mit h kann eine sehr umfangreiche Hilfe aufgerufen werden.

Ein Modul lässt sich am einfachsten mit

cpan install PAKET::NAME

installieren (hier das nicht-existente Paket PAKET::NAME). cpan eignet sich weniger gut um Module zu installieren oder zu aktualisieren, aber sehr gut um nach Paketen zu suchen:

i /JSON/

findet jedes Paket, das die Zeichenkette JSON im Bereich Autor, Bundle, Distribution oder Modul enthält. Das sind meist viele Ergebnisse, aber liefert einen Überblick "was geht".

Erfahrungsgemäß ist cpan recht störrisch in der Handhabung. Deshalb empfehle ich die Nutzung von cpanminus.

OS-Paketmanager

Debian und Derivate (Ubuntu, Raspbian, etc.)

Vom Debian-Projekt werden viele, aber lange nicht alle, Pakete des CPAN auch als Pakete für den eingebauten Paketmanager apt bereitsgestellt. Dort sind momentan etwa 4 000 Pakete verfügbar, d.h. rund 2% der im CPAN verfügbaren Pakete. Es ist nicht immer trivial, ein Paket zu finden. Ein einfacher Fall ist z.B. das Paket Readonly, das über cpanm Readonly oder apt-get install libreadonly-perl installiert werden könnte. Im Allgemeinen kann man sagen, dass sich der Name des apt-Paketes aus dem Prefix lib, gefolgt vom Paketnamen in Kleinbuchstaben, bei dem die :: durch - ersetzt wurden, und dem Suffix -perl zusammensetzt:

CPAN Debian-Paket
Rose::URI librose-uri-perl
Sah::Schemas::Rinci libsah-schemas-rinci-perl

Kein Beispiel wäre vollständig ohne Ausnahme, z.B.:

libromana-perligata-perl installiert das Perl-Paket Lingua::Romana::Perligata, müsste nach der selbstgewählten Konvention aber liblingua-romana-perligata-perl heißen.

Vorteilhaft ist, dass man die Pakete zusammen mit anderen Debian-Paketen automatisch auf dem aktuellen Stand halten kann, z.B. unattended-upgrades - man spart so eine doppelte Implementierung der Updates.

Wiederum von Nachteil ist, dass man mit einer auf ein Release festgelegten Quelle irgendwann auch keine Updates der Perl-Pakete mehr erhält.

SuSE Linux

YaST bietet aktuell etwa 3 121 der rund 200 000 Pakete in devel:languages:perl an, dazu kommen noch einige Community-Pakete mit einer trivial nicht feststellbaren Anzahl an Paketen. Im Paket perl-App-cpanminus ist cpanm enthalten.

RedHat Linux

MacOS

Für MacOS gilt, dass das installierte Perl den cpan-Client und eine Auswahl an Module mitbringt. cpanm lässt sich installieren und sollte auch der Weg der Wahl sein. Es ist außerdem möglich, Pakete über MacPorts zu installieren. MacPorts bietet noch weniger Pakete (aktuell 1 797 für Perl 5.26, 1 799 für Perl 5.28) als Debian.

Windows

ActiveState bietet eine Perl-Distribution an, die bereits mit einigen Module, 214 bei Perl 5.28, ausgeliefert wird.

Empfohlene Pakete

Im FHEM-Umfeld werden aktuell rund 120 CPAN-Pakete (mit Sub-Paketen) eingesetzt die keine Core-Module sind und ggf. für ein FHEM-Modul nachinstalliert werden müssen:

  • Authen::OATH
  • AutoLoader
  • B
  • Carp
  • Color
  • Compress::Zlib
  • Convert::Base32
  • Cpanel::JSON::XS
  • Crypt::Argon2
  • Crypt::CBC
  • Crypt::Cipher::AES
  • Crypt::ECB
  • Crypt::Mode::CBC
  • Crypt::MySQL
  • Crypt::NaCl::Sodium
  • Crypt::Rijndael
  • Crypt::Rijndael_PP
  • Crypt::URandom
  • DBI
  • DBI::Const::GetInfoType
  • Data::Dumper
  • Data::UUID
  • Date::Parse
  • DateTime
  • Device::Firmata
  • Device::Firmata::Base
  • Device::Firmata::Constants
  • Device::Firmata::Error
  • Device::Firmata::Language
  • Device::Firmata::Platform
  • Device::Firmata::Protocol
  • Device::SerialPort
  • Device::USB
  • Digest::CRC
  • Digest::SHA1
  • Encode::Detect::Detector
  • Expect
  • File::HomeDir
  • HTML::Entities
  • HTML::Parser
  • HTTP::Cookies
  • HTTP::Daemon
  • HTTP::Headers
  • HTTP::Request
  • HTTP::Request::Common
  • IO::Interface::Simple
  • IO::Socket::Multicast
  • IO::Socket::Multicast6
  • IO::Socket::SSL
  • IO::Socket::Timeout
  • IO::String
  • Image::ExifTool
  • Image::LibRSVG
  • Image::Size
  • Inline
  • JSON
  • JSON::MaybeXS
  • JSON::XS
  • JSON::backportPP
  • JsonMod::JSON::Path::Node
  • LWP
  • LWP::Simple
  • LWP::UserAgent~6
  • Linux::Inotify2
  • LiquidCrystal
  • Lirc::Client
  • List::MoreUtils
  • MIME::Lite
  • MP3::Info
  • MP3::Tag
  • MP3::Tag::CDDB_File
  • MP3::Tag::Cue
  • MP3::Tag::File
  • MP3::Tag::ID3v1
  • MP3::Tag::ID3v2
  • MP3::Tag::ImageExifTool
  • MP3::Tag::ImageSize
  • MP3::Tag::Inf
  • MP3::Tag::LastResort
  • MP3::Tag::ParseData
  • Mail::IMAPClient
  • Mojolicious~5.54
  • Net::Address::IP::Local
  • Net::Bonjour
  • Net::FTPSSL
  • Net::Jabber
  • Net::MQTT::Constants
  • Net::MQTT::Message
  • Net::MQTT::Message::JustMessageId
  • Net::Rendezvous
  • Net::SIP
  • Net::SIP::Packet
  • Net::SMTP::SSL
  • Net::Telnet
  • Net::UPnP::AV::MediaRenderer
  • Net::UPnP::AV::MediaServer
  • Net::UPnP::ControlPoint
  • Net::UPnP::Device
  • Net::UPnP::Service
  • Net::XMPP::Namespaces
  • Nmap::Parser
  • Path::Tiny
  • Paws::Polly
  • Perl::PrereqScanner::NotQuiteLite
  • RPC::XML::Client
  • RPC::XML::Server
  • RiveScript
  • SOAP::Lite
  • Text::Iconv
  • Try::Tiny
  • UPnP::Common
  • UPnP::ControlPoint
  • URI::Escape
  • WWW::Jawbone::Up
  • Win32::SerialPort
  • XML::LibXML
  • XML::Parser::Lite

Liste als plain text, z.B. um sie bei einer automatisierten Installation verwenden zu können. Die Liste wurde mit Perl::PrereqScanner aus dem FHEM/-Verzeichnis erstellt, durch Core::List gefiltert und mit cpanm auf Nicht-CPAN-Module (z.B. FHEM::Meta oder DevIO) geprüft.