Composer — Abhängigkeitsverwaltung für PHP

Praxis-Guide zu Composer — Abhängigkeitsmanager für PHP: Pakete installieren, Versionen verwalten und das Autoloading optimieren.

Composer ist das zentrale Werkzeug zur Abhängigkeitsverwaltung in der PHP-Welt – es installiert Bibliotheken, hält ihre Versionen sauber im Griff und erzeugt das Autoloading, damit du Klassen ohne manuelle require-Zeilen nutzen kannst. Über das zentrale Paket-Verzeichnis Packagist ziehst du mit wenigen Befehlen alles von Guzzle bis zum kompletten Laravel-Framework in dein Projekt. Dieser Guide führt dich durch den Alltag: Projekt aufsetzen, Pakete einbinden und aktualisieren, Versionen mit Constraints steuern und den Autoloader für die Produktion optimieren.

Projekt aufsetzen

composer init — Erstellt interaktiv eine neue composer.json im aktuellen Verzeichnis.

composer init

composer init --name=<vendor>/<package> — Erstellt eine neue composer.json mit vorgegebenem Paketnamen.

composer init --name=acme/my-project

composer create-project <package> <directory> — Erstellt ein neues Projekt aus einem bestehenden Paket (wie Klonen + Installieren).

composer create-project laravel/laravel my-app

composer create-project <package> <directory> <version> — Erstellt ein neues Projekt aus einer bestimmten Version eines Pakets.

composer create-project laravel/laravel my-app "11.*"

Pakete installieren

composer install — Installiert alle in composer.lock definierten Abhängigkeiten (oder aus composer.json, falls keine Lock-Datei existiert).

composer install

composer install --no-dev — Installiert nur Produktions-Abhängigkeiten und überspringt require-dev-Pakete.

composer install --no-dev

composer install --optimize-autoloader — Installiert die Abhängigkeiten und erzeugt eine optimierte Class-Map fürs Autoloading.

composer install --optimize-autoloader

composer install --no-scripts — Installiert die Abhängigkeiten, ohne in composer.json definierte Skripte auszuführen.

composer install --no-scripts

composer install --dry-run — Simuliert die Installation, ohne tatsächlich etwas zu verändern.

composer install --dry-run

Pakete einbinden (require)

composer require <package> — Fügt ein Paket zu require hinzu und installiert es.

composer require guzzlehttp/guzzle

composer require <package>:<version> — Bindet eine bestimmte Version oder ein Versions-Constraint eines Pakets ein.

composer require guzzlehttp/guzzle:^7.0

composer require --dev <package> — Fügt ein Paket als Entwicklungs-Abhängigkeit hinzu (require-dev).

composer require --dev phpunit/phpunit

composer require <package> --with-all-dependencies — Erlaubt beim Einbinden, alle Abhängigkeiten (auch bereits installierte) zu aktualisieren.

composer require symfony/console --with-all-dependencies

composer require <package> -W — Kurzform von --with-all-dependencies.

composer require laravel/framework -W

Pakete aktualisieren

composer update — Aktualisiert alle Abhängigkeiten auf die neuesten Versionen im Rahmen der composer.json-Constraints.

composer update

composer update <package> — Aktualisiert ein einzelnes Paket auf seine neueste erlaubte Version.

composer update guzzlehttp/guzzle

composer update <package1> <package2> — Aktualisiert mehrere bestimmte Pakete auf einmal.

composer update symfony/console symfony/http-foundation

composer update --with-all-dependencies — Aktualisiert zusätzlich die Abhängigkeiten der aktualisierten Pakete.

composer update --with-all-dependencies

composer update --no-dev — Aktualisiert nur Produktions-Abhängigkeiten.

composer update --no-dev

composer update --dry-run — Zeigt eine Vorschau der Aktualisierungen, ohne tatsächlich etwas zu ändern.

composer update --dry-run

composer update --prefer-lowest — Aktualisiert auf die niedrigstmöglichen Versionen im Rahmen der Constraints. Nützlich, um die Kompatibilität zu testen.

composer update --prefer-lowest

Pakete entfernen

composer remove <package> — Entfernt ein Paket aus require und deinstalliert es.

composer remove guzzlehttp/guzzle

composer remove --dev <package> — Entfernt ein Paket aus require-dev.

composer remove --dev phpunit/phpunit

composer remove <package> --no-update — Entfernt ein Paket aus composer.json, ohne die Lock-Datei zu aktualisieren.

composer remove monolog/monolog --no-update

Informationen & Suche

composer show — Listet alle installierten Pakete mit ihren Versionen auf.

composer show

composer show <package> — Zeigt detaillierte Informationen zu einem bestimmten installierten Paket.

composer show guzzlehttp/guzzle

composer show --tree — Zeigt die installierten Pakete als Abhängigkeitsbaum.

composer show --tree

composer show --outdated — Listet installierte Pakete auf, für die neuere Versionen verfügbar sind.

composer show --outdated

composer show --direct — Zeigt nur direkt eingebundene Pakete (keine transitiven Abhängigkeiten).

composer show --direct

composer search <keyword> — Sucht auf Packagist anhand eines Stichworts nach Paketen.

composer search markdown parser

composer depends <package> — Zeigt, welche Pakete von einem bestimmten Paket abhängen (umgekehrte Abhängigkeitssuche).

composer depends psr/log

composer why <package> — Alias für depends. Zeigt, warum ein Paket installiert ist.

composer why symfony/polyfill-mbstring

composer why-not <package> <version> — Zeigt, warum ein Paket nicht auf eine bestimmte Version aktualisiert werden kann.

composer why-not laravel/framework 11.0

Lock-Datei & Autoloader

composer dump-autoload — Erzeugt die Autoloader-Dateien neu, ohne Pakete zu installieren oder zu aktualisieren.

composer dump-autoload

composer dump-autoload --optimize — Erzeugt einen optimierten Autoloader mit Class-Map für bessere Performance.

composer dump-autoload --optimize

composer dump-autoload --classmap-authoritative — Nutzt ausschließlich die Class-Map fürs Autoloading. Am schnellsten, findet aber neue Klassen nicht automatisch.

composer dump-autoload --classmap-authoritative

composer validate — Prüft composer.json und composer.lock auf Fehler.

composer validate

composer validate --strict — Prüft mit strengen Checks. Liefert auch bei Warnungen einen Exit-Code ungleich null.

composer validate --strict

Versions-Constraints

composer require <package>:^<version> — Caret-Constraint. Erlaubt Updates, die die erste Ziffer ungleich null nicht verändern (empfohlen).

composer require guzzlehttp/guzzle:^7.5

composer require <package>:~<version> — Tilde-Constraint. Erlaubt Updates nur an der letzten angegebenen Stelle.

composer require monolog/monolog:~2.0

composer require <package>:<exact_version> — Bindet eine exakte Version ein. Keine Updates erlaubt.

composer require phpunit/phpunit:10.5.3

composer require <package>:">=<min> <<max>" — Nutzt einen Versionsbereich mit Vergleichsoperatoren.

composer require monolog/monolog:">=2.0 <3.0"

composer require <package>:* — Wildcard-Constraint. Erlaubt jede Version (für Produktion nicht empfohlen).

composer require acme/internal-lib:*

composer require <package>:dev-<branch> — Bindet einen bestimmten Branch (Entwicklungsversion) eines Pakets ein.

composer require acme/lib:dev-main

Skripte & Hooks

composer run-script <script> — Führt ein im scripts-Abschnitt der composer.json definiertes Skript aus.

composer run-script test

composer run <script> — Kurz-Alias für run-script.

composer run lint

composer run-script --list — Listet alle in composer.json definierten Skripte auf.

composer run-script --list

composer exec <binary> — Führt ein Binary aus dem Verzeichnis vendor/bin aus.

composer exec phpunit -- --filter=MyTest

Globale Pakete

composer global require <package> — Installiert ein Paket global (systemweit verfügbar).

composer global require laravel/installer

composer global show — Listet alle global installierten Pakete auf.

composer global show

composer global update — Aktualisiert alle global installierten Pakete.

composer global update

composer global remove <package> — Entfernt ein global installiertes Paket.

composer global remove laravel/installer

Cache & Diagnose

composer clear-cache — Leert den internen Paket-Cache.

composer clear-cache

composer diagnose — Führt Diagnose-Checks für häufige Probleme durch (Verbindung, Berechtigungen usw.).

composer diagnose

composer self-update — Aktualisiert Composer selbst auf die neueste Version.

composer self-update

composer self-update --rollback — Setzt Composer auf die zuvor installierte Version zurück.

composer self-update --rollback

composer config --list — Listet alle aktuellen Konfigurationswerte auf.

composer config --list

composer config --global home — Zeigt den Pfad des Composer-Home-Verzeichnisses.

composer config --global home

Repositories & Plattformen

composer config repositories.<name> vcs <url> — Fügt ein VCS-Repository (Git) als Paketquelle hinzu.

composer config repositories.my-lib vcs https://github.com/acme/my-lib.git

composer config repositories.<name> path <path> — Fügt ein lokales Pfad-Repository für die Entwicklung hinzu.

composer config repositories.local-lib path ../my-lib

composer config repositories.<name> '{"type": "composer", "url": "<url>"}' — Fügt ein privates Composer-Repository hinzu (z. B. Private Packagist, Satis).

composer config repositories.private '{"type": "composer", "url": "https://packages.example.com"}'

composer config platform.php <version> — Täuscht die PHP-Version für die Abhängigkeitsauflösung vor (nützlich, um auf ein Deployment-Ziel zu zielen).

composer config platform.php 8.2.0

Fazit

Composer nimmt dir die mühsame Verwaltung von PHP-Abhängigkeiten ab – der Schlüssel zu reproduzierbaren Builds ist dabei die composer.lock. Merke dir den Unterschied: composer update löst Versionen neu auf und schreibt die Lock-Datei um, während composer install exakt die dort festgehaltenen Versionen installiert. In der Produktion solltest du deshalb fast immer nur install ausführen und update der lokalen Entwicklung überlassen. Für Deployments lohnen sich --no-dev und ein optimierter Autoloader (-o bzw. --optimize-autoloader), damit keine Test-Werkzeuge und kein unnötiger Overhead auf dem Server landen. Behalte im Hinterkopf, dass Composer-Skripte und -Plugins beliebigen Code ausführen – bei fremden Paketen ist --no-scripts ein sinnvoller Schutz, und secure-http (Standard) sollte aktiviert bleiben, damit Pakete ausschließlich über HTTPS geladen werden.

Verwandte Kommandos

  • artisan – Kommandozeilen-Tool des Laravel-Frameworks
  • cargo – Paket- und Build-Manager für Rust
  • drush – Kommandozeilen-Shell für Drupal