Wie Sie bereits wissen, ist [Composer] (https://getcomposer.org/) ein robuster Paket- und Abhängigkeitsmanager für PHP, mit dem Sie elegant Hunderte von Projekten auf einmal verwalten und einmal geschriebenen Code gleichzeitig an alle Anwendungen verteilen können.
Dieses Tutorial dient als detaillierte und umfassende Anleitung für Entwickler. Wir behandeln alle wichtigen fortgeschrittenen Techniken für die Arbeit mit Composer und erklären die technischen Details und relevanten Abhängigkeiten.
Unabhängig von der Plattform laden wir von [der offiziellen Composer-Website] (https://getcomposer.org/) herunter.
Intern wird die PHP-Datei composer-setup.php
heruntergeladen, die, wenn sie im CLI-Modus ausgeführt wird, Composer installieren kann. Es ist auch wichtig zu wissen, dass Composer ohne PHP nicht funktioniert. Vergewissern Sie sich also zunächst, dass PHP auf Ihrem Computer läuft (es muss nur für Terminal verfügbar sein).
Auf Mac und Linux funktioniert Composer direkt nach der Installation und Sie müssen nur den Befehl composer -v
aufrufen, um schnell zu überprüfen, ob Composer korrekt installiert ist.
Unter Linux kann der folgende Befehl zur Installation verwendet werden: /usr/bin/php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
Unter Windows empfiehlt es sich, das Tool Git Bash for Windows zu installieren, mit dem Sie ein spezielles Terminal öffnen können, das sich fast wie Linux verhält und mit dem Sie in der gleichen Umgebung wie unter Linux arbeiten können.
Die Installation auf Servern erfolgt auf die gleiche Weise wie in einer lokalen Umgebung. Vergewissern Sie sich nur, dass Sie die richtige Version von PHP haben, die Composer intern verwendet.
Composer implementiert eine Reihe von Befehlen.
Die Verwendung ist: composer <Befehl>
, zum Beispiel: composer update
.
Übersicht für 1.10.0
:
Befehl | Beschreibung / Bedeutung |
---|---|
Über |
Zeigt kurze Informationen über Composer an. |
Archiv |
Erstellt ein Archiv mit dem Inhalt des ausgewählten Composer-Pakets. |
browse |
Öffnet die Homepage des ausgewählten Pakets, des Autors oder eine andere verwandte Seite in einem Webbrowser. Oftmals enthalten sie auch eine Dokumentation über die Verwendung der Software. |
cc |
Löscht den internen Composer-Cache mit Versionen von Paketen, die in der Vergangenheit heruntergeladen wurden. |
check-platform-reqs |
Prüfen, ob die Installationsanforderungen für die aktuelle Plattform erfüllt sind. |
clear-cache |
Löschen des internen Composer-Caches. |
clearcache |
Internen Composer-Cache löschen. |
config |
|
create-project |
Erstellt ein neues Projekt auf der Grundlage des ausgewählten Pakets und erstellt automatisch einen Ordner, in dem das Projekt abgelegt wird. |
Abhängig |
Zeigt an, welche Pakete die Installation des ausgewählten Pakets verursacht haben. |
Diagnose |
Diagnostiziert das System, um häufige Fehler zu identifizieren. Die Verarbeitung der Ausgabe ist dem Entwickler überlassen, es handelt sich lediglich um eine Auflistung. |
dump-autoload |
Erzeugt einen neuen Autoloader. |
dumpautoload |
Erzeugt einen neuen Autoloader. |
exec |
Führt Binärdateien und Skripte von Vendor aus. |
Untersucht, wie man Abhängigkeiten herstellt/verändert. | |
global |
Ermöglicht die Ausführung globaler Composer-Befehle über die Variable $COMPOSER_HOME . |
help |
Druckt die Hilfe für Befehle aus. |
home |
Öffnet die Startseite eines bestimmten Pakets im Browser. |
i |
Installiert alle Projektabhängigkeiten gemäß der Datei composer.lock , wenn diese existiert und gültig ist. Wenn es ein Problem gibt, werden die Informationen aus composer.json verwendet und composer.lock wird in seinen ursprünglichen Zustand zurückversetzt. |
info |
Zeigt Informationen über die aktuell installierten Pakete im Projekt an. Zeigt die Namen aller Pakete, ihre aktuellen Versionen und eine kurze Beschreibung an. |
init |
Erzeugt eine Basisfunktion composer.json im aktuellen Verzeichnis. |
install |
Installiert alle Projektabhängigkeiten gemäß der Datei composer.lock , wenn diese existiert und gültig ist. Wenn ein Problem auftritt, werden die Informationen aus composer.json verwendet und composer.lock wird in seinen ursprünglichen Zustand zurückversetzt. |
Lizenzen |
Zeigt eine Liste aller Pakete, ihrer Versionen und der aktuellen Lizenz an. |
"Liste" | Zeigt eine Liste der verfügbaren Befehle an. |
Zeigt eine Liste aller Pakete an, für die eine neuere Version zur Installation verfügbar ist und die die Abhängigkeiten erfüllen. Für jedes Paket wird die letzte kompatible Version angezeigt, die Composer für die Installation vorschlägt. | |
Zeigt an, welche Pakete und Abhängigkeiten die Installation des angeforderten Pakets oder der angeforderten Version verhindern. | |
remove |
Entfernt das Paket aus dem require oder require-dev Konfigurationsabschnitt. |
require |
Fügt das angeforderte Paket zu composer.json hinzu und installiert es. Wenn die Abhängigkeiten nicht erfüllt werden können, wird der ursprüngliche Zustand wiederhergestellt. |
run |
Führt die definierten Skripte in composer.json aus. |
run-script |
Führt die definierten Skripte in composer.json aus. |
Suche |
Sucht Pakete nach Schlüsselwort oder Suchanfrage. |
self-update |
Aktualisiert die interne composer.phar auf die neueste Version. |
selfupdate |
Aktualisiert die interne composer.phar auf die neueste Version. |
show |
|
status |
Zeigt eine Zusammenfassung der lokalen Änderungen an, die manuell an den Paketen vorgenommen wurden, basierend auf einem Vergleich mit der Quelle des Pakets, von der es ursprünglich installiert wurde. |
suggests |
Zeigt Vorschläge für Pakete an. Die Vorschläge können verschiedene Arten von Aktionen umfassen, wie z. B. die Installation von Sicherheitsupdates usw. |
update |
Aktualisiert das gesamte Projekt gemäß den Abhängigkeiten, so dass sie immer alle von composer.json erfüllt werden. Bei Erfolg wird die Datei composer.lock aktualisiert, in die die aktuell installierten Versionen geschrieben werden. |
upgrade |
Alias zu update . |
u |
Alias zu update . |
validate |
Prüft composer.json und composer.lock auf Syntaxfehler. |
Warum |
Zeigt an, welche Pakete die Installation des aktuell ausgewählten Pakets verursacht haben, einschließlich aller Abhängigkeiten. |
Why-not |
Zeigt an, welche Pakete und Versionen die Installation des ausgewählten Pakets oder der Version verhindern. |
Jedes von Composer verwaltete Projekt wird durch eine Datei composer.json
in seinem Stammverzeichnis definiert, in der alle Abhängigkeiten festgelegt sind. Die Datei kann entweder manuell für ein bestehendes Projekt oder automatisch bei der Erstellung eines Projekts erstellt werden.
Da alles im Composer ein Paket ist, kann auch das Projekt selbst auf einem Paket basieren. Wenn Sie beispielsweise Dutzende oder Hunderte sehr ähnlicher Projekte erstellen, ist es sinnvoll, deren Grundkonfiguration und Struktur in ein separates Paket zu packen, auf dem die Installation basiert.
Ein Beispiel für ein solches Paket ist meine Baraja Sandbox, die auf reinem Nette 3.0 basiert und eine grundlegende Abhängigkeit zu meinem Package Manager hinzufügt, den ich für alle Projekte und das Abhängigkeitsmanagement in der Nette-Konfiguration verwende.
Die Sandbox wird dann einfach mit dem Befehl installiert:
$ composer create-project baraja/sandbox <your-project-name>
Anhand des Projektnamens erstellt der Composer dann automatisch einen Ordner, in den das Projekt installiert wird (Kopieren des Paketinhalts und Installieren der Abhängigkeiten).
Im Ordner vendor
verwaltet Composer dann alle Pakete (ihre physischen Dateien befinden sich dort) und generiert einen Autoload von Klassen, den wir idealerweise direkt als Zeile in index.php
einfügen:
require __DIR__ . '/anbieter/autoload.php';// Der Anwendungscode selbst
Innerhalb eines funktionalen Projekts können wir sehr einfach neue Pakete installieren und Abhängigkeiten hinzufügen.
Es gibt 2 Möglichkeiten, dies zu tun:
composer require ...
,composer.json
im Abschnitt require
hinzufügen und dann den Befehl composer update
verwenden.Versuchen Sie zum Beispiel PackageManager zu installieren: composer require baraja-core/package-manager
, oder Doctrine: composer require baraja-core/doctrine
.
Wenn das gewählte Paket nicht installiert werden kann, können spezifische Gründe abgefragt werden und Composer listet die Abhängigkeiten auf, die dies verhindern. Oft reicht es aus, eine Abhängigkeit von einer bestimmten Version zu beheben oder inkompatiblen Code zu entfernen. Ausführliche Informationen erhalten Sie mit dem Befehl: "Composer why baraja-core/doctrine".
Ein gut durchdachtes Projekt wird so entwickelt, dass Sie im Laufe der Zeit problemlos Aktualisierungen herunterladen können und immer über die neuesten Versionen aller Pakete verfügen. Der Hauptvorteil besteht darin, dass alle Fehler behoben werden, die Leistung oft verbessert wird und viele neue Funktionen zur Verfügung stehen. Außerdem wird die schrittweise Umstellung die Aktualisierung nach langer Zeit weniger kompliziert machen, da Sie Probleme in kleinerem Rahmen beheben und Inkompatibilitäten vermeiden können.
Um alle Pakete und Abhängigkeiten zu aktualisieren, verwenden Sie den Befehl composer update
.
Der Aktualisierungsvorgang selbst kann in einigen Fällen fehlschlagen. Der Grund dafür ist in der Regel entweder eine defekte Abhängigkeit oder ein inkompatibles Paket.
Ausführliche Informationen darüber, warum ein Paket nicht installiert werden kann, erhalten Sie mit dem Befehl: composer why-not baraja-core/doctrine
. Wenn wir das Paket bereits haben und nur die spezifische Version nicht funktioniert (es will nicht installiert werden), können wir auch nach der spezifischen Version fragen: composer why-not baraja-core/doctrine:v1.0.20
.
In der Datei "composer.json" können wir auch die Abhängigkeit von einer bestimmten Laufzeit auflisten. Dies ist besonders nützlich, wenn wir ein Projekt mit mehreren Personen entwickeln und überprüfen wollen, ob diese alle Erweiterungen installiert haben.
In der Regel wird die PHP-Version überprüft (sie muss "7.1.0" oder höher sein):
{"require": {"php": ">=7.1.0"}}
Möglicherweise andere Systemerweiterungen:
{"require": {"php": ">=7.1.0","ext-json": "*","ext-session": "*","ext-PDO": "*"}}
Diese Regeln werden dann bei der Installation von Paketen oder Upgrades berücksichtigt. Dies hilft, Probleme zu vermeiden, die erst zur Laufzeit auffallen würden. Typischerweise muss z.B. ein Zahlungs-Gateway-Paket mit der API kommunizieren, also muss es Abhängigkeiten von den Erweiterungen curl
und json
zulassen.
Oftmals sind Abhängigkeitsverletzungen auf eine schlechte PHP-Version zurückzuführen. In diesem Fall gibt Composer eine Meldung aus, z. B. "Ihre PHP-Version (7.3.11), die von der Version "config.platform.php" (7.1) überschrieben wird, erfüllt diese Anforderung nicht".
Sehr oft wird der Fehler durch die Einstellungen direkt im Projekt composer.json
verursacht, wo sich der folgende Abschnitt befindet:
"config": {"platform": {"php": "7.2"}}
Die Änderung muss direkt in der Datei vorgenommen werden. Bei einem globalen Projekt (vor der Installation oder mit einer globalen Abhängigkeit) können Sie die Composer-Version mit composer config -g platform.php 7.2.14
erzwingen (der Schalter -g
bedeutet global
).
In manchen Fällen wollen wir die neuesten Paketversionen installieren und die lokalen Umgebungseinstellungen ignorieren. In diesem Fall können wir den erweiterten Befehl verwenden:
$ composer update --ignore-platform-reqs
Verwenden Sie den Schalter ignore-platform-reqs
auf eigene Gefahr, er kann das Projekt beschädigen! Verwenden Sie ihn nicht, wenn Sie die Konsequenzen nicht verstehen.
Composer ist eigentlich ein PHP-Skript, das in ein so genanntes PHAR verpackt ist, das eine kompilierte Version einer PHP-Anwendung ist. Die Kenntnis dieser Informationen kann sinnvoll genutzt werden, um z. B. den Aufruf selbst besser zu parametrisieren.
Bei wirklich großen Projekten kommt es manchmal vor, dass der Arbeitsspeicher knapp wird und wir viel mehr zuweisen oder die Verarbeitungszeit der Skripte erhöhen müssen.
Unter Windows können Sie dazu beispielsweise diesen Befehl verwenden:
$ php -d memory_limit=-1 C:/xampp/htdocs/composer.phar update
Mit dem Schalter memory_limit=-1
wird Composer angewiesen, sich nicht an das RAM-Limit zu halten und so viel Speicher zu verbrauchen, wie er benötigt.
Nach der Ausführung von Composer-Aktionen können Sie die automatische Ausführung von benutzerdefinierten Skripten aufrufen, die entweder bestimmte Aktionen für das Projekt durchführen oder beispielsweise eine Konfiguration nach der Bereitstellung generieren. Ich verwende diesen Ansatz hauptsächlich auf einem lokalen Server, um ein automatisches Datenbankkonfigurationswerkzeug anzubieten, ein Datenbankschema zu generieren und so weiter.
Wir registrieren die erforderlichen Skripte im Abschnitt scripts
der Datei composer.json
:
"scripts": {"post-autoload-dump": "Baraja\\PackageManager\\PackageRegistrator::composerPostAutoloadDump"}
In diesem Fall wird die statische Methode composerPostAutoloadDump
in der Klasse Baraja\PackageManager\PackageRegistrator
automatisch aufgerufen. Composer verfügt über diese Klasse, weil er zuerst die Autoloader-Klassen erzeugt hat.
Wenn wir nur die Skripte ausführen und keine unnötigen Aktionen mit Composer durchführen wollen, ist der Befehl composer dump
sehr nützlich, da er nur einen neuen Autoloader generiert (den ich empfehle, um ihn immer auf dem neuesten Stand zu halten) und dann die Skripte sofort ausführt. Wenn Sie Skripte verwenden möchten, habe ich ein fertiges Paket [Baraja PackageManager] (https://github.com/baraja-core/package-manager) vorbereitet, das intelligente Skripte und interaktive Schnittstellen für das Nette-Framework implementiert.
Eine Frage, die wir oft mit Entwicklern diskutieren, ist, ob man den Inhalt des Ordners vendor
in Git versionieren oder bei jeder Installation neu erstellen soll.
Im Allgemeinen scheint die sauberste Lösung darin zu bestehen, den Inhalt nicht zu versionieren und alles jedes Mal neu zu installieren. Die Realität sieht jedoch so aus, dass ein Entwickler von Zeit zu Zeit die Entwicklung eines Pakets einstellt oder es sogar ganz entfernt. Das ständige Herunterladen von Paketen erschwert auch lokale Installationen und Aktualisierungen, verlangsamt die Bereitstellung und kann manchmal für kurze Ausfälle der Website verantwortlich sein, wenn neue Paketversionen nicht korrekt heruntergeladen werden.
Ich betrachte die Suspendierung des Verkäufers als eine Form der "Sicherheit". Wenn sich die Dateien physisch im Versionsverwaltungssystem befinden, haben wir zumindest eine rudimentäre Sicherheit auf dem Produktionsserver, dass die Pakete funktionieren und ihr Code genau so ist, wie er in der lokal laufenden Installation ist. Darüber hinaus benötigt Vendor oft nur einige MB, was bei den heutigen Festplattenkapazitäten sicherlich die Sicherheit einer funktionierenden Website wert ist.
Praktische Anmerkung: Für die durchschnittliche Website, die ich betreue, benötigt vendor
nicht mehr als 30 MB
, was eine akzeptable Kapazität für Git ist. Wenn wir mit Junior ein Repository klonen, müssen wir ihn nicht darin schulen, wie man die Website zum Laufen bringt, und es funktioniert einfach sofort.
Sie können Ihre eigenen Pakete innerhalb von Composer erstellen, entweder öffentlich verfügbar (registriert bei Packagist) oder privat (Sie müssen Ihren eigenen Paketserver haben, zum Beispiel Satis).
Das Thema der Erstellung, Pflege, Entwicklung und Versionierung von Paketen ist sehr komplex und wird Gegenstand eines eigenen Artikels sein.
In der Zwischenzeit können Sie den Artikel [Semantic Versioning] (https://semver.org/lang/cs/) lesen, den ich für Sie übersetzt habe.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | de