Composer: Tipps zur Verwendung
Composer ist ein Werkzeug zur Verwaltung von Abhängigkeiten in PHP. Es ermöglicht uns, die Bibliotheken aufzulisten, von denen unser Projekt abhängt, und wird sie für uns installieren und aktualisieren. Wir zeigen Ihnen:
- wie man Composer installiert
- seine Verwendung in einem neuen oder bestehenden Projekt
Installation
Composer ist eine ausführbare .phar
-Datei, die Sie herunterladen und wie folgt installieren:
Windows
Verwenden Sie den offiziellen Installer Composer-Setup.exe.
Linux, macOS
Es genügen 4 Befehle, die Sie von dieser Seite kopieren können.
Durch das Ablegen im Ordner, der im System-PATH
enthalten ist, wird Composer global zugänglich:
$ mv ./composer.phar ~/bin/composer # oder /usr/local/bin/composer
Verwendung im Projekt
Um Composer in Ihrem Projekt verwenden zu können, benötigen Sie lediglich die Datei composer.json
. Diese
beschreibt die Abhängigkeiten Ihres Projekts und kann auch weitere Metadaten enthalten. Eine grundlegende
composer.json
kann also so aussehen:
{
"require": {
"nette/database": "^3.0"
}
}
Hier geben wir an, dass unsere Anwendung (oder Bibliothek) das Paket nette/database
benötigt (der Paketname setzt
sich aus dem Organisationsnamen und dem Projektnamen zusammen) und eine Version wünscht, die der Bedingung ^3.0
entspricht (d.h. die neueste Version 3).
Wir haben also im Projektstamm die Datei composer.json
und starten die Installation mit:
composer update
Composer lädt Nette Database in den Ordner vendor/
. Außerdem erstellt er die Datei composer.lock
,
die Informationen darüber enthält, welche Versionen der Bibliotheken genau installiert wurden.
Composer generiert die Datei vendor/autoload.php
, die wir einfach einbinden können und sofort mit der Verwendung
der Bibliotheken beginnen können, ohne weitere Arbeit:
require __DIR__ . '/vendor/autoload.php';
$db = new Nette\Database\Connection('sqlite::memory:');
Aktualisierung der Pakete auf die neuesten Versionen
Die Aktualisierung der verwendeten Bibliotheken auf die neuesten Versionen gemäß den in composer.json
definierten Bedingungen übernimmt der Befehl composer update
. Z.B. bei der Abhängigkeit
"nette/database": "^3.0"
installiert er die neueste Version 3.x.x, aber nicht mehr Version 4.
Um die Bedingungen in der Datei composer.json
beispielsweise auf "nette/database": "^4.1"
zu
aktualisieren, 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 in der Befehlszeile auflisten, z.B.:
composer require nette/application nette/forms latte/latte tracy/tracy ...
Was unpraktisch ist. Verwenden Sie stattdessen das einfache Skript Composer Frontline, das dies 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
Geben Sie als projektname
den Namen des Verzeichnisses für Ihr Projekt ein und bestätigen Sie. Composer lädt
das Repository nette/web-project
von GitHub herunter, das bereits die Datei composer.json
enthält, und
gleich danach das Nette Framework. Es sollte nur noch notwendig sein, die Berechtigungen für das Schreiben in die
Ordner temp/
und log/
festzulegen, und das Projekt sollte zum Leben erweckt werden.
Wenn Sie wissen, auf welcher PHP-Version das Projekt gehostet wird, vergessen Sie nicht, sie einzustellen.
PHP-Version
Composer installiert immer die Versionen von Paketen, die mit der PHP-Version kompatibel sind, die Sie gerade verwenden
(genauer gesagt, mit der PHP-Version, die in der Befehlszeile beim Ausführen von Composer verwendet wird). Dies ist jedoch
wahrscheinlich nicht die gleiche Version, die Ihr Hosting verwendet. Daher ist es sehr wichtig, der Datei
composer.json
Informationen über die PHP-Version auf dem Hosting hinzuzufügen. Danach werden nur noch Versionen von
Paketen installiert, die mit dem Hosting kompatibel sind.
Dass das Projekt beispielsweise auf PHP 8.2.3 laufen wird, legen wir mit dem Befehl fest:
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 jedoch noch an einer anderen Stelle der Datei angegeben, und zwar im Abschnitt
require
. Während die erste Zahl angibt, für welche Version Pakete installiert werden, gibt die zweite Zahl an, für
welche Version die Anwendung selbst geschrieben ist. Und danach stellt beispielsweise PhpStorm das PHP language level
ein. (Natürlich macht es keinen Sinn, dass sich diese Versionen unterscheiden, daher ist die doppelte Angabe eine
Ungeschicklichkeit.) Diese Version stellen Sie mit dem 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 möchten, beispielsweise zum Testen, wird Composer die
Installation eines solchen Pakets verweigern. Die Lösung ist die Option --ignore-platform-req=php+
, die bewirkt,
dass Composer die Obergrenzen der erforderlichen PHP-Version ignoriert.
Falsche Meldungen
Beim Upgrade von Paketen oder Änderungen der Versionsnummern kommt es vor, dass ein Konflikt auftritt. Ein Paket hat
Anforderungen, die im Widerspruch zu einem anderen stehen und ähnliches. Composer gibt jedoch manchmal falsche Meldungen aus. Er
meldet einen Konflikt, der real nicht existiert. In diesem Fall 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 daraus entnehmen, was und wie Sie es anpassen müssen.
Packagist.org – zentrales Repository
Packagist ist das Haupt-Repository, in dem Composer versucht, Pakete zu finden, wenn wir ihm nichts anderes sagen. Wir können hier auch eigene Pakete veröffentlichen.
Was, wenn wir kein zentrales Repository verwenden möchten?
Wenn wir firmeninterne Anwendungen haben, die wir einfach nicht öffentlich hosten können, erstellen wir dafür ein Firmen-Repository.
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, das
Sie durch Einbinden der Datei vendor/autoload.php
starten.
Es ist jedoch auch möglich, Composer zum Laden weiterer Klassen auch außerhalb des Ordners vendor
zu verwenden.
Die erste Möglichkeit ist, Composer definierte Ordner und Unterordner durchsuchen zu lassen, alle Klassen zu finden und sie in
den Autoloader aufzunehmen. Dies erreichen Sie durch die Einstellung autoload > classmap
in
composer.json
:
{
"autoload": {
"classmap": [
"src/", # beinhaltet den Ordner src/ und seine Unterordner
]
}
}
Anschließend muss bei jeder Änderung der Befehl composer dumpautoload
ausgeführt und die Autoloading-Tabellen
neu generiert werden. Das ist äußerst unpraktisch, und es ist viel besser, diese Aufgabe dem RobotLoader zu überlassen, der dieselbe Tätigkeit automatisch im Hintergrund
und viel schneller erledigt.
Die zweite Möglichkeit ist, PSR-4 einzuhalten. Vereinfacht gesagt handelt es
sich um ein System, bei dem Namensräume und Klassennamen der Verzeichnisstruktur und den Dateinamen entsprechen, d.h. z.B.
App\Core\RouterFactory
befindet sich in der Datei /path/to/App/Core/RouterFactory.php
.
Beispielkonfiguration:
{
"autoload": {
"psr-4": {
"App\\": "app/" # Der Namensraum App\ befindet sich im Verzeichnis app/
}
}
}
Wie genau das Verhalten konfiguriert wird, erfahren Sie in der Composer-Dokumentation.
Testen neuer Versionen
Sie möchten eine neue Entwicklungsversion eines Pakets testen. Wie gehen Sie vor? Fügen Sie zunächst dieses Optionspaar zur
Datei composer.json
hinzu, das die Installation von Entwicklungsversionen von Paketen erlaubt, aber nur darauf
zurückgreift, wenn keine Kombination von stabilen Versionen existiert, die den Anforderungen entspricht:
{
"minimum-stability": "dev",
"prefer-stable": true,
}
Weiterhin empfehlen wir, die Datei composer.lock
zu löschen, da Composer manchmal unverständlicherweise die
Installation verweigert und dies das Problem löst.
Nehmen wir an, es handelt sich um das Paket nette/utils
und die neue Version hat die Nummer 4.0. Sie installieren
sie mit dem Befehl:
composer require nette/utils:4.0.x-dev
Oder Sie können eine bestimmte Version installieren, zum Beispiel 4.0.0-RC2:
composer require nette/utils:4.0.0-RC2
Wenn jedoch ein anderes Paket von der Bibliothek abhängt, das auf eine ältere Version gesperrt ist (z.B. ^3.1
),
ist es ideal, das Paket zu aktualisieren, damit es mit der neuen Version funktioniert. Wenn Sie jedoch die Einschränkung nur
umgehen und Composer zwingen möchten, die Entwicklungsversion zu installieren und so zu tun, als wäre es 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 können eigene vorbereitete Befehle und Skripte aufgerufen werden, als wären es native Composer-Befehle. Bei
Skripten, die sich im Ordner vendor/bin
befinden, muss dieser Ordner nicht angegeben werden.
Als Beispiel definieren wir in der Datei composer.json
ein Skript, das mit dem Nette Tester Tests startet:
{
"scripts": {
"tester": "tester tests -s"
}
}
Die Tests starten wir dann mit composer tester
. Den Befehl können wir auch aufrufen, wenn wir uns nicht im
Stammverzeichnis des Projekts, sondern in einem Unterverzeichnis befinden.
Senden Sie ein Dankeschön
Wir zeigen Ihnen einen Trick, mit dem Sie die Autoren von Open Source erfreuen können. Geben Sie auf GitHub den Bibliotheken,
die Ihr Projekt verwendet, auf einfache Weise einen Stern. Installieren Sie einfach die Bibliothek
symfony/thanks
:
composer global require symfony/thanks
Und führen Sie dann aus:
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, es nicht zu verwenden:
composer -g config preferred-install dist