Composer 2.11.0-RC1 wurde am 22. Oktober als Vorabversion veröffentlicht. Das Tag ist von Seldaek, Jordi Boggiano signiert und verweist auf den Commit 31eb692. Die Maintainer bitten um Tests sowie um Fehlermeldungen mit Stacktraces und reproduzierbaren Fällen. Die Änderungen decken den Bereich von Composer 2.10.3 bis 2.11.0-RC1 ab.

terminal
composer self-update --preview
composer self-update --stable

Die vorläufige source-fallback-Konfiguration aus Version 2.10 entfällt. Dist-Installationen wechseln nicht mehr automatisch auf Source. Die composer-plugin-api steht nun auf Version 2.11.0.

Composer 2.11 RC1 bringt Sicherheits- und Resolver-Updates
Screenshot: Composer Releases ↗

TLS-Verbindungen mit nicht mehr vertrauenswürdigen Zwischenzertifikaten werden abgewiesen. Das betrifft auch die kompromittierten eMudhra-Zertifikate, selbst wenn der CA-Speicher des Systems deren Root-Zertifikate weiterhin akzeptiert. Bin-Proxies escapen nun von Paketen kontrollierte Pfade und Shebangs korrekt. Bin-Pfade mit Shell-Metazeichen werden zurückgewiesen. Die secure-http-Prüfung erfasst jetzt auch fehlerhafte unsichere URLs und die Git-Transport-Syntax. Eigene Repository-Header werden nicht mehr an Dist-URLs anderer Hosts gesendet, deren Name lediglich mit dem Repository-Host beginnt.

Composer kann neu veröffentlichte Paketversionen für eine konfigurierbare Cooldown-Zeit zurückhalten. Das soll das Risiko kompromittierter Releases begrenzen. Benutzerdefinierte Policies erhalten die Option block-scope und können damit auch während der Installation sperren. Terminal-Fortschritt und Statusmeldungen unterstützen OSC-7501- und OSC-9-Escape-Sequenzen. COMPOSER_TERMINAL_STATUS steuert diese Ausgabe.

Der Audit-Befehl erhält --direct, alternativ -D, für die Prüfung direkter Abhängigkeiten. Für Bitbucket Cloud wird der neue SSH-Host ssh.bitbucket.org unterstützt und auch für den SSH-Fallback verwendet. strict-psr-autoloader ergänzt die gleichnamige Option --strict-psr-autoloader. Ein optimierter Autoload-Dump warnt, wenn sich Pfade nur durch Groß- und Kleinschreibung unterscheiden.

VCS-Repositories können mit only-branches die geladenen Branches begrenzen. show --tree --format=json gibt nun die installierten Versionen von Unterabhängigkeiten aus. Projekte mit sehr vielen Abhängigkeiten senden gebündelte Anfragen an die Security-Advisory-API. Auf HTTP-429-Antworten und Retry-After-Header reagiert Composer mit Warten und einem erneuten Versuch. Der User-Agent weist nun auf AI-Coding-Agenten hin. Beim Anlegen einer Bibliothek mit init fragt Composer, ob composer.lock in .gitattributes mit export-ignore versehen werden soll.

Die Abhängigkeitsauflösung benötigt weniger Zeit und Speicher. Composer fordert HTTP/3 nicht mehr an, wodurch eine Verzögerung bei neueren curl-Versionen entfällt. outdated und show --latest laden Paketmetadaten parallel. Konfliktmeldungen erklären klarer, wenn Security Advisories bestimmte Versionen blockieren.

Ein veralteter Lock-File-Status nach Änderungen an der Policy-Konfiguration wird korrigiert. Eine Installation bricht nun sauber ab, wenn composer.lock einen Merge-Konflikt im content-hash enthält. Unvollständige ZIP-Downloads werden erneut geladen und nicht im Cache abgelegt. Generierte Dateien wie Autoloader und composer.json werden atomar ersetzt. Das verhindert Probleme mit Hardlinks und parallelen Lesern.

SSH-URLs behalten ihren Benutzernamen in Git-Befehlen. Damit wird ein Authentifizierungsfehler aus Composer 2.10.3 behoben. Die Authentifizierung von GitLab-CI-Job-Tokens funktioniert wieder. Eigene Header aus Projektdateien auth.json und aus COMPOSER_AUTH werden mit globalen Headern zusammengeführt. Parallele Anfragen verwenden Zugangsdaten aus einer anderen Anfrage erneut, statt sofort ungültige Zugangsdaten zu melden.

Composer meldet jetzt das GitHub-API-Ratelimit, wenn der Clone-Fallback scheitert. outdated markiert Pakete ohne installierbare Version nicht mehr als veraltet. update --minimal-changes verarbeitet Wildcard-Paketnamen korrekt. bump behandelt Constraints im Stil von >=10 und lockert OR-Constraints nicht mehr. Security Advisories werden nicht mehr fälschlich auf benannte Entwicklungs-Branches wie dev-main angewendet.

Das vendor-Verzeichnis wird bei der Root-Classmap-Suche nun auch in zuvor problematischen Fällen ausgeschlossen. self-update scheitert beim Austausch des PHAR nicht mehr mit einem Fehler wegen einer fehlenden Klasse. clear-cache --no-cache meldet jetzt, dass der Cache deaktiviert ist, statt fehlende Verzeichnisse zu melden. Leere Script-Befehle gelten als No-op.

suggests gibt nun einen Fehler aus, wenn nach einem nicht installierten Paket oder nach einem durch --no-dev ausgeschlossenen Paket gefiltert wird. JsonManipulator::addSubNode() verändert keinen verschachtelten Schlüssel mit demselben Namen mehr. Repository-Warnungen erscheinen nicht mehrfach. Plugin-Capability-Klassen werden erst nach der Prüfung ihrer Interfaces instanziiert. Beim Finden von Inline-Paketen ohne UID erzeugt Composer keine Warnungen mehr.