PHP/Tutorials/Abhängigkeiten mit Composer verwalten

Aus SELFHTML-Wiki
< PHP‎ | Tutorials
Wechseln zu: Navigation, Suche
Logo-composer-transparent.png

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.

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 requires lediglich ein require 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.

Natürlich lässt sich eine Abhängigkeit auch wieder entfernen, dabei wird auch die heruntergeladene Bibliothek gelöscht:
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.

Weblinks

  • Packagist – „The PHP Package Repository“
  • Composer – „A Dependency Manager for PHP“
  • wiki.ubuntuusers.de: Composer