Tipps zur Verwendung von Composer
Composer ist ein Werkzeug zur Verwaltung von Abhängigkeiten in PHP. Es erlaubt Ihnen, die Bibliotheken, von denen Ihr Projekt abhängt, zu deklarieren, und es wird sie für Sie installieren und aktualisieren. Wir werden lernen:
- wie man Composer installiert
- wie man ihn in einem neuen oder bestehenden Projekt verwendet
Einrichtung
Composer ist eine ausführbare .phar
Datei, die Sie wie folgt herunterladen und installieren.
Windows
Verwenden Sie das offizielle Installationsprogramm Composer-Setup.exe.
Linux, macOS
Alles was Sie brauchen sind 4 Befehle, die Sie von dieser Seite kopieren können.
Außerdem wird Composer durch Kopieren in einen Ordner im PATH
global zugänglich:
$ mv ./composer.phar ~/bin/composer # or /usr/local/bin/composer
Verwendung im Projekt
Um Composer in Ihrem Projekt verwenden zu können, benötigen Sie lediglich eine composer.json
Datei. Diese Datei
beschreibt die Abhängigkeiten Ihres Projekts und kann auch andere Metadaten enthalten. Die einfachste composer.json
kann wie folgt aussehen:
{
"require": {
"nette/database": "^3.0"
}
}
Wir sagen hier, dass unsere Anwendung (oder Bibliothek) von dem Paket nette/database
abhängt (der Name des Pakets
besteht aus dem Namen des Herstellers und dem Namen des Projekts) und die Version benötigt, die der Versionsbeschränkung
^3.0
entspricht.
Wenn wir also die Datei composer.json
im Projektstamm haben und sie ausführen:
composer update
Der Composer lädt die Nette-Datenbank in das Verzeichnis vendor
herunter. Außerdem wird eine Datei
composer.lock
erstellt, die Informationen darüber enthält, welche Bibliotheksversionen genau installiert
wurden.
Composer erzeugt eine vendor/autoload.php
Datei. Sie können diese Datei einfach einbinden und die Klassen, die
diese Bibliotheken bereitstellen, ohne zusätzliche Arbeit verwenden:
require __DIR__ . '/vendor/autoload.php';
$db = new Nette\Database\Connection('sqlite::memory:');
Pakete auf die neuesten Versionen aktualisieren
Um alle verwendeten Pakete auf die neueste Version gemäß den in composer.json
definierten
Versionsbeschränkungen zu aktualisieren, verwenden Sie den Befehl composer update
. Zum Beispiel wird für die
Abhängigkeit "nette/database": "^3.0"
die neueste Version 3.x.x installiert, aber nicht Version 4.
Um die Versionseinschränkungen in der Datei composer.json
z.B. 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üssen Sie diese in der Befehlszeile auflisten, z. B:
composer require nette/application nette/forms latte/latte tracy/tracy ...
Das ist unpraktisch. Verwenden Sie daher ein einfaches Skript Composer Frontline, das diese Aufgabe für Sie übernimmt:
php composer-frontline.php
Neues Projekt erstellen
Ein neues Nette-Projekt kann durch Ausführen eines einfachen Befehls erstellt werden:
composer create-project nette/web-project name-of-the-project
Anstelle von name-of-the-project
sollten Sie den Namen des Verzeichnisses für Ihr Projekt angeben und den Befehl
ausführen. Composer wird das Repository nette/web-project
von GitHub holen, das bereits die Datei
composer.json
enthält, und gleich danach das Nette Framework selbst installieren. Nun müssen nur noch die Schreibrechte für die Verzeichnisse
temp/
und log/
überprüft werden und schon kann es
losgehen.
Wenn Sie wissen, mit welcher PHP-Version das Projekt gehostet werden soll, sollten Sie diese unbedingt einrichten.
PHP-Version
Composer installiert immer die Versionen der Pakete, die mit der PHP-Version kompatibel sind, die Sie gerade verwenden (oder
besser gesagt, die PHP-Version, die auf der Kommandozeile verwendet wird, wenn Sie Composer starten). Das ist wahrscheinlich nicht
die Version, die Ihr Webhost verwendet. Deshalb ist es sehr wichtig, dass Sie Informationen über die PHP-Version Ihres Hosts in
Ihre Datei composer.json
aufnehmen. Danach werden nur noch die Versionen der Pakete installiert, die mit dem Host
kompatibel sind.
Um zum Beispiel das Projekt auf PHP 8.2.3 einzustellen, verwenden Sie den Befehl:
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 auch an anderer Stelle in der Datei aufgeführt, im Abschnitt require
. Während
die erste Zahl die Version angibt, für die Pakete installiert werden, sagt die zweite Zahl, für welche Version die Anwendung
selbst geschrieben wurde. (Natürlich macht es keinen Sinn, dass diese Versionen unterschiedlich sind, daher ist die doppelte
Angabe eine Redundanz). Sie setzen diese Version mit dem Befehl:
composer require php 8.2.3 --no-update
Oder direkt in der Datei “Composer.json”:
{
"require": {
"php": "8.2.3"
}
}
PHP-Version ignorieren
Pakete geben normalerweise sowohl die niedrigste Version von PHP an, mit der sie kompatibel sind, als auch die höchste
Version, mit der sie getestet wurden. Wenn Sie vorhaben, eine noch neuere Version von PHP zu verwenden, etwa zu Testzwecken, wird
Composer die Installation eines solchen Pakets verweigern. Die Lösung besteht darin, die Option
--ignore-platform-req=php+
zu verwenden, die Composer veranlasst, die Obergrenzen der erforderlichen PHP-Version zu
ignorieren.
False Berichte
Bei der Aktualisierung von Paketen oder der Änderung von Versionsnummern kommt es zu Konflikten. Ein Paket hat Anforderungen,
die mit einem anderen in Konflikt stehen, und so weiter. Composer gibt jedoch gelegentlich eine falsche Meldung aus. Er meldet
einen Konflikt, der nicht wirklich existiert. In diesem Fall hilft es, die Datei composer.lock
zu löschen und es
erneut zu versuchen.
Bleibt die Fehlermeldung bestehen, dann ist sie ernst gemeint und Sie müssen ihr entnehmen, was Sie wie ändern müssen.
Packagist.org – Globales Repository
Packagist ist das Hauptpaket-Repository, in dem Composer versucht, Pakete zu suchen, wenn nicht anders angegeben. Sie können hier auch Ihre eigenen Pakete veröffentlichen.
Was, wenn wir das zentrale Repository nicht wollen?
Wenn wir interne Anwendungen oder Bibliotheken in unserem Unternehmen haben, die nicht öffentlich auf Packagist gehostet werden können, können wir unsere eigenen Repositories für diese Projekte erstellen.
Mehr über Repositories finden Sie in der offiziellen Dokumentation.
Autoloading
Eine Schlüsselfunktion von Composer ist das automatische Laden aller installierten Klassen, das Sie durch Einfügen einer
Datei vendor/autoload.php
starten.
Es ist jedoch auch möglich, Composer zu verwenden, um andere Klassen außerhalb des Ordners vendor
zu laden. Die
erste Möglichkeit besteht darin, Composer die definierten Ordner und Unterordner durchsuchen zu lassen, alle Klassen zu finden
und sie in den Autoloader aufzunehmen. Dazu setzen Sie autoload > classmap
in composer.json
:
{
"autoload": {
"classmap": [
"src/", # includes the src/ folder and its subfolders
]
}
}
Anschließend müssen Sie bei jeder Änderung den Befehl composer dumpautoload
ausführen und die
Autoloader-Tabellen neu generieren lassen. Dies ist äußerst lästig, und es ist weitaus besser, diese Aufgabe RobotLoader anzuvertrauen, der dieselbe Tätigkeit automatisch im Hintergrund und
viel schneller durchführt.
Die zweite Möglichkeit ist, PSR-4 zu folgen. Einfach gesagt handelt es sich
um ein System, bei dem die Namensräume und Klassennamen der Verzeichnisstruktur und den Dateinamen entsprechen, d. h.
App\Core\RouterFactory
befindet sich in der Datei /path/to/App/Core/RouterFactory.php
. Beispiel für
eine Konfiguration:
{
"autoload": {
"psr-4": {
"App\\": "app/" # the App\ namespace is in the app/ directory
}
}
}
In der Composer-Dokumentation finden Sie eine genaue Beschreibung, wie Sie dieses Verhalten konfigurieren können.
Testen neuer Versionen
Sie möchten eine neue Entwicklungsversion eines Pakets testen. Wie kann man das tun? Fügen Sie zunächst dieses Paar von
Optionen in die Datei composer.json
ein, das es Ihnen ermöglicht, Entwicklungsversionen von Paketen zu installieren,
aber nur, wenn es keine Kombination aus stabiler Version gibt, die den Anforderungen entspricht:
{
"minimum-stability": "dev",
"prefer-stable": true,
}
Wir empfehlen auch, die Datei composer.lock
zu löschen, da Composer manchmal unverständlicherweise die
Installation verweigert und dies das Problem lösen wird.
Nehmen wir an, das Paket heißt nette/utils
und die neue Version ist 4.0. Sie installieren es 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 ein anderes Paket von der Bibliothek abhängt und auf eine ältere Version beschränkt ist (z. B. ^3.1
), ist
es ideal, das Paket zu aktualisieren, damit es mit der neuen Version funktioniert. Wenn Sie jedoch nur die Beschränkung umgehen
und Composer zwingen wollen, die Entwicklungsversion zu installieren und so zu tun, als ob es sich um eine ältere Version handelt
(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"
Aufrufen von Befehlen
Sie können Ihre eigenen benutzerdefinierten Befehle und Skripte über Composer so aufrufen, als wären es native
Composer-Befehle. Skripte, die sich im Ordner vendor/bin
befinden, müssen diesen Ordner nicht angeben.
Als Beispiel definieren wir ein Skript in der Datei composer.json
, das Nette Tester verwendet, um Tests auszuführen:
{
"scripts": {
"tester": "tester tests -s"
}
}
Wir führen die Tests dann mit composer tester
aus. Wir können den Befehl auch dann aufrufen, wenn wir uns nicht
im Stammverzeichnis des Projekts, sondern in einem Unterverzeichnis befinden.
Dank senden
Wir werden Ihnen einen Trick zeigen, der Open-Source-Autoren glücklich machen wird. Sie können den Bibliotheken, die Ihr
Projekt verwendet, ganz einfach einen Stern auf GitHub geben. Installieren Sie einfach die Bibliothek
symfony/thanks
:
composer global require symfony/thanks
Und dann ausführen:
composer thanks
Versuchen Sie es!
Konfiguration
Composer ist eng mit dem Versionskontrollwerkzeug Git integriert. Wenn Sie Git nicht verwenden, müssen Sie dies dem Composer mitteilen:
composer -g config preferred-install dist