Composer: Tipps zur Verwendung

Composer ist ein Werkzeug zur Verwaltung von Abhängigkeiten in PHP. Es erlaubt Ihnen, die Bibliotheken aufzuzählen, von denen Ihr Projekt abhängt, und installiert und aktualisiert sie für Sie. Wir zeigen Ihnen:

  • wie Sie Composer installieren
  • wie Sie ihn in einem neuen oder bestehenden Projekt verwenden

Installation

Composer ist eine ausführbare .phar-Datei, die Sie folgendermaßen herunterladen und installieren:

Windows

Verwenden Sie den offiziellen Installer Composer-Setup.exe.

Linux, macOS

Es genügen 4 Befehle, die Sie sich von dieser Seite kopieren können.

Wenn Sie die Datei außerdem in ein Verzeichnis legen, das im System-PATH liegt, wird Composer global verfügbar:

$ mv ./composer.phar ~/bin/composer # oder /usr/local/bin/composer

Verwendung im Projekt

Um Composer in Ihrem Projekt zu verwenden, brauchen Sie nur eine Datei composer.json. Sie beschreibt die Abhängigkeiten Ihres Projekts und kann außerdem weitere Metadaten enthalten. Die einfachste composer.json kann so aussehen:

{
	"require": {
		"nette/database": "^3.0"
	}
}

Wir sagen hier, dass unsere Anwendung (oder Bibliothek) das Paket nette/database benötigt (der Paketname besteht aus dem Namen der Organisation und dem Namen des Projekts) und eine Version verlangt, die der Bedingung ^3.0 entspricht (also die neueste Version 3).

Wir haben also im Wurzelverzeichnis des Projekts die Datei composer.json und starten:

composer update

Composer lädt Nette Database in das Verzeichnis vendor/ herunter. Außerdem erzeugt er die Datei composer.lock, die Informationen darüber enthält, welche Bibliotheksversionen genau installiert wurden.

Composer erzeugt die Datei vendor/autoload.php. Diese Datei können Sie einfach einbinden und die Klassen der Bibliotheken ohne jede weitere Arbeit verwenden:

require __DIR__ . '/vendor/autoload.php';

$db = new Nette\Database\Connection('sqlite::memory:');

Aktualisierung der Pakete auf die neuesten Versionen

Für die Aktualisierung der verwendeten Bibliotheken auf die neuesten Versionen gemäß den in composer.json definierten Bedingungen ist der Befehl composer update zuständig. Bei der Abhängigkeit "nette/database": "^3.0" installiert er zum Beispiel die neueste Version 3.x.x, aber nicht mehr Version 4.

Um die Bedingungen in der Datei composer.json zu aktualisieren, etwa auf "nette/database": "^4.1", damit die neueste Version installiert werden kann, verwenden Sie den Befehl composer require nette/database.

Um alle verwendeten Nette-Pakete zu aktualisieren, müssten Sie sie alle auf der Kommandozeile aufzählen, z. B.:

composer require nette/application nette/forms latte/latte tracy/tracy ...

Das ist unpraktisch. Verwenden Sie deshalb das einfache Skript Composer Frontline, das das für Sie erledigt:

php composer-frontline.php

Erstellung eines neuen Projekts

Ein neues Nette-Projekt erstellen Sie mit einem einzigen Befehl:

composer create-project nette/web-project projektname

Setzen Sie für projektname den Verzeichnisnamen Ihres Projekts ein und führen Sie den Befehl aus. Composer lädt das Repository nette/web-project von GitHub herunter, das bereits eine Datei composer.json enthält, und danach gleich das Nette Framework selbst. Es sollte nur noch nötig sein, die Verzeichnisrechte zu setzen für die Verzeichnisse temp/ und log/, und das Projekt sollte laufen.

Wenn Sie wissen, auf welcher PHP-Version Ihr Projekt gehostet wird, stellen Sie sie unbedingt ein.

PHP-Version

Composer installiert immer diejenigen Paketversionen, die mit der PHP-Version kompatibel sind, die Sie gerade verwenden (genauer gesagt mit der PHP-Version, die beim Ausführen von Composer auf der Kommandozeile benutzt wird). Das ist aber vermutlich nicht dieselbe Version, die Ihr Hosting verwendet. Deshalb ist es sehr wichtig, in die Datei composer.json die Information über die PHP-Version auf dem Hosting einzutragen. Danach werden nur noch Paketversionen installiert, die mit dem Hosting kompatibel sind.

Dass das Projekt zum Beispiel auf PHP 8.2.3 läuft, stellen wir mit diesem Befehl ein:

composer config platform.php 8.2.3

So wird die Version in die Datei composer.json geschrieben:

{
	"config": {
		"platform": {
			"php": "8.2.3"
		}
	}
}

Die PHP-Versionsnummer wird allerdings noch an einer anderen Stelle der Datei angegeben, nämlich im Abschnitt require. Während die erste Zahl bestimmt, für welche Version die Pakete installiert werden, sagt die zweite Zahl, für welche Version die Anwendung selbst geschrieben ist. Danach richtet zum Beispiel PhpStorm das PHP language level ein. (Natürlich ergibt es keinen Sinn, dass sich diese Versionen unterscheiden, die doppelte Angabe ist also ein Versäumnis.) Diese Version stellen Sie mit folgendem Befehl ein:

composer require php 8.2.3 --no-update

Oder direkt in der Datei composer.json:

{
	"require": {
		"php": "8.2.3"
	}
}

Ignorieren der PHP-Version

Pakete geben in der Regel sowohl die niedrigste PHP-Version an, mit der sie kompatibel sind, als auch die höchste, mit der sie getestet wurden. Wenn Sie eine noch neuere PHP-Version verwenden wollen, etwa zu Testzwecken, wird Composer die Installation eines solchen Pakets verweigern. Die Lösung ist die Option --ignore-platform-req=php+, die dafür sorgt, dass Composer die oberen Grenzen der geforderten PHP-Version ignoriert.

Falsche Meldungen

Beim Upgrade von Paketen oder beim Ändern von Versionsnummern kommt es manchmal zu Konflikten. Ein Paket hat Anforderungen, die im Widerspruch zu einem anderen stehen, und so weiter. Composer gibt aber gelegentlich falsche Meldungen aus. Er meldet einen Konflikt, der in Wirklichkeit gar nicht existiert. In solchen Fällen hilft es, die Datei composer.lock zu löschen und es erneut zu versuchen.

Wenn die Fehlermeldung bestehen bleibt, ist sie ernst gemeint, und Sie müssen ihr entnehmen, was und wie zu ändern ist.

Packagist.org – zentrales Repository

Packagist ist das Haupt-Repository, in dem Composer standardmäßig nach Paketen sucht. Sie können hier auch eigene Pakete veröffentlichen.

Was, wenn wir kein zentrales Repository verwenden möchten?

Wenn wir firmeninterne Anwendungen oder Bibliotheken haben, die wir schlicht nicht öffentlich hosten können, legen wir uns für sie eigene Repositories an.

Mehr zum Thema Repositories finden Sie in der offiziellen Dokumentation.

Autoloading

Eine wesentliche Eigenschaft von Composer ist, dass er Autoloading für alle von ihm installierten Klassen bereitstellt. Sie starten es, indem Sie die Datei vendor/autoload.php einbinden.

Sie können Composer aber auch zum Laden weiterer Klassen außerhalb des Verzeichnisses vendor/ verwenden. Die erste Möglichkeit besteht darin, Composer definierte Verzeichnisse und Unterverzeichnisse durchsuchen, alle Klassen finden und in den Autoloader aufnehmen zu lassen. Das erreichen Sie mit der Einstellung autoload > classmap in composer.json:

{
	"autoload": {
		"classmap": [
			"src/",      # schließt das Verzeichnis src/ und seine Unterverzeichnisse ein
		]
	}
}

Anschließend müssen Sie nach jeder Änderung den Befehl composer dumpautoload ausführen und die Autoloading-Tabellen neu erzeugen lassen. Das ist außerordentlich unbequem. Weitaus besser ist es, diese Aufgabe dem RobotLoader anzuvertrauen, der dieselbe Tätigkeit automatisch im Hintergrund und viel schneller erledigt.

Die zweite Möglichkeit ist, sich an PSR-4 zu halten. Vereinfacht gesagt handelt es sich um ein System, bei dem Namespaces und Klassennamen der Verzeichnisstruktur und den Dateinamen entsprechen, also z. B. App\Core\RouterFactory liegt in der Datei /path/to/App/Core/RouterFactory.php. Beispielkonfiguration:

{
	"autoload": {
		"psr-4": {
			"App\\": "app/"   # der Namespace App\ liegt im Verzeichnis app/
		}
	}
}

Wie genau Sie dieses Verhalten konfigurieren, erfahren Sie in der Composer-Dokumentation.

Testen neuer Versionen

Sie wollen eine neue Entwicklungsversion eines Pakets testen? So geht es. Fügen Sie zuerst dieses Optionspaar in Ihre Datei composer.json ein. Es erlaubt die Installation von Entwicklungsversionen, Composer greift aber nur dann darauf zurück, wenn keine Kombination stabiler Versionen die Anforderungen erfüllt:

{
	"minimum-stability": "dev",
	"prefer-stable": true,
}

Außerdem empfehlen wir, die Datei composer.lock zu löschen, denn manchmal verweigert Composer die Installation auf unerklärliche Weise, und das löst das Problem.

Nehmen wir an, es handelt sich um das Paket nette/utils und die neue Version trägt die Nummer 4.0. Sie installieren sie mit dem Befehl:

composer require nette/utils:4.0.x-dev

Oder Sie können eine konkrete Version installieren, zum Beispiel 4.0.0-RC2:

composer require nette/utils:4.0.0-RC2

Wenn aber ein anderes Paket von der Bibliothek abhängt und auf eine ältere Version festgelegt ist (z. B. ^3.1), ist die ideale Lösung, dieses Paket zu aktualisieren, damit es mit der neuen Version funktioniert. Wenn Sie die Einschränkung jedoch nur umgehen und Composer zwingen wollen, die Entwicklungsversion zu installieren und vorzugeben, es handle sich um eine ältere Version (z. B. 3.1.6), können Sie das Schlüsselwort as verwenden:

composer require nette/utils "4.0.x-dev as 3.1.6"

Aufruf von Befehlen

Über Composer lassen sich eigene, vorbereitete Befehle und Skripte aufrufen, als wären es native Composer-Befehle. Bei Skripten, die im Verzeichnis vendor/bin liegen, müssen Sie diesen Pfad nicht angeben.

Als Beispiel definieren wir in der Datei composer.json ein Skript, das mit Nette Tester die Tests startet:

{
	"scripts": {
		"tester": "tester tests -s"
	}
}

Die Tests starten wir dann mit composer tester. Den Befehl können Sie auch dann aufrufen, wenn Sie sich nicht im Wurzelverzeichnis des Projekts befinden, sondern in einem seiner Unterverzeichnisse.

Senden Sie ein Dankeschön

Wir zeigen Ihnen einen Trick, mit dem Sie Open-Source-Autoren eine Freude machen. Sie geben auf einfache Weise den Bibliotheken, die Ihr Projekt verwendet, einen Stern auf GitHub. Es genügt, die Bibliothek symfony/thanks zu installieren:

composer global require symfony/thanks

Und dann auszuführen:

composer thanks

Probieren Sie es aus!

Konfiguration

Composer ist eng mit dem Versionierungswerkzeug Git verbunden. Wenn Sie es nicht installiert haben, müssen Sie Composer mitteilen, dass er es nicht verwenden soll:

composer -g config preferred-install dist