PHP/Tutorials/Abhängigkeiten mit Composer verwalten
Composer ist ein Paketmanager für PHP und kann zur Installation und Aktualisierung von Bibliotheken und Applikationen verwendet werden. Dabei greift Composer auf das Verzeichnis Packagist zurück, eigene Paket-Verzeichnisse können aber ebenso verwendet werden. Zudem sind weder Composer noch Packagist auf PHP festgelegt, so lässt sich beispielsweise auch der in JavaScript geschriebene WYSIWYG-Editor TinyMCE über Composer installieren.
Inhaltsverzeichnis
Welche Probleme löst Composer?
Gegenüber dem „simplen“ händischen Herunterladen des PHP- oder JavaScript-Codes als ZIP-Archiv bietet Composer mehrere Vorteile:
- ist Composer bereits installiert, so reicht ein Befehl aus, um eine Abhängigkeit zu installieren.
- Viele Pakete unterstützen den Autoloading-Mechanismus von Composer, sodass statt vielen verschiedenen
require
s lediglich einrequire
ausreicht:require __DIR__ . '/vendor/autoload.php';
- Pakete können Abhängigkeiten zu anderen Paketen besitzen. Composer löst diese automatisch auf.
- Pakete können Mindestanforderungen an eine bestimmte PHP-Version spezifizieren.
- Mit wenigen Befehlen lassen sich Pakete aktualisieren.
- standardisierte Trennung von eigenem Code und externen Abhängigkeiten
Kurz: Wenn man mit PHP arbeitet und dabei Bibliotheken benutzt, so möchte man Composer benutzen. Man kann darauf verzichten, aber nach einer kurzen Einarbeitung macht es das Leben wesentlich leichter.
Composer installieren
Composer ist selbst in PHP geschrieben und wird als einzelnes PHP Archive (phar) bereitgestellt. Für erste Experimente reicht es, die composer.phar in das Projektverzeichnis zu legen. Anschließen kann in einem Terminalfenster getestet werden, ob Composer funktioniert:
php composer.phar --version
Anschließend sollte eine Ausgabe wie die folgende erfolgen:
Composer version 1.10.1 2020-03-13 20:34:27
Composer kann auch global auf dem System installiert werden, Details dazu finden sich in der entsprechenden Dokumentation.
Composer zur Verwaltung von Abhängigkeiten verwenden
Als konkretes Beispiel soll der Markdown-Parser Parsedown installiert und verwendet werden. Dazu weist man Composer an, Parsedown als Abhängigkeit zu definieren und zu installieren:
php composer.phar require erusev/parsedown
Dabei passieren mehrere Dinge:
- Composer legt eine Datei mit dem Namen
composer.json
an, in der Abhängigkeiten (zunächst steht dort natürlich nur Parsedown) definiert werden. - In einem Unterverzeichnis von
vendor
wird der heruntergeladene Code von Parsedown abgelegt - In der Datei
composer.lock
speichert Composer, welche Version einer Abhängigkeit genau installiert wurde. Dies wird später noch relevant.
Nun können wir testen, ob Parsedown funktioniert:
require __DIR__ . '/vendor/autoload.php';
$Parsedown = new Parsedown();
echo $Parsedown->text('Hello _Parsedown_!');
Ausführen dieses Codes sollte <p>Hello <em>Parsedown</em>!</p>
ausgeben.
php composer.phar remove erusev/parsedown
Abhängigkeiten aktualisieren
Mittels php composer.phar update
werden alle Abhängigkeiten aktualisiert, als zusätzlicher Parameter kann auch eine oder mehrere Abhängigkeiten übergeben werden, dann werden nur diese übergeben, im Falle von Parsedown:
php composer.phar update erusev/parsedown
Dies aktualisiert auch die Datei composer.lock
, falls neue Versionen installiert wurden.
Die Bewandnis von composer.lock
Der Grund, warum Composer separat speichert, welche Abhängigkeiten benötigt werden (→ composer.json
) und welche konkret installiert wurden (→ composer.lock
), liegt in der Reproduzierbarkeit: Installiert ein Entwickler heute eine Abhängigkeit in der aktuellen Version 1.3, erscheint kurz danach jedoch die zu 1.3 inkompatible Version 2.0 und stellt er das Projekt beispielsweise anderen über GitHub zur Verfügung (dabei lässt er aber das vendor-Verzeichnis sinnvollerweise aus), so würde ein anderer durch Ausführen des Befehls php composer.phar install
Version 2.0 erhalten, die inkompatibel zu Version 1.3 und damit zum selbst entwickelten Code ist.
Hier sorgt jedoch das Vorhandensein der Datei composer.lock
dafür, dass Composer nicht Version 2.0, sondern 1.3 der Abhängigkeit installiert, sodass alle Benutzer des Git-Respositorys auf dem gleichen Stand sind. Die Version würde nur durch Verwendung von php composer.phar update
aktualisiert.