Blog image 10 tricks to work efficiently with the Composer in Drupal 8

10 Tricks, um effizient mit dem Composer in Drupal zu arbeiten

Heutzutage ist Composer eines der wichtigsten Werkzeuge in der PHP-Welt, da es Entwicklern ermöglicht, sich mit der Verwaltung externer Bibliotheken zu befassen und deren laufende Updates zu erleichtern. Bei Droptica machen wir viel Drupal-Entwicklung und können uns ein Leben ohne Composer nicht vorstellen. Wenn Sie effizient mit Drupal arbeiten möchten, ohne Composer zu verwenden, lesen Sie die folgenden 10 Tipps, um die Möglichkeiten des beliebten Paketmanagers besser zu verstehen und zu nutzen.

1. Aktualisieren Sie sowohl die Module als auch den Core mit Composer

Drupal und Composer können zusammenarbeiten, aber die Bedingungen für diese Kooperation sind ziemlich spezifisch, insbesondere wenn es um Core-Updates geht. Einige ältere Projekte sind so konfiguriert, dass Composer nur Module, Themen und externe Bibliotheken herunterladen kann. Der Core selbst muss manuell aktualisiert werden.

Manuelles Aktualisieren macht die Verwendung eines Paketmanagers hinfällig, aber es gibt eine einfache Möglichkeit, dies zu beheben. Sie können die Vorlage unter https://github.com/drupal/recommended-project verwenden. Ich kann diese Methode zur Einführung neuer Projekte in Drupal nicht genug empfehlen – hier bei Droptica nutzen wir sie für die überwiegende Mehrheit unserer Projekte. Es ermöglicht Ihnen, nur Ihren eigenen Code im Repository zu speichern, ohne externe Abhängigkeiten. Wenn eine neue Version von Drupal veröffentlicht wird, laden Sie sie einfach herunter, indem Sie folgenden Befehl ausführen:

composer update drupal/core --with-all-dependencies

2. Beschleunigen Sie mit hirak/prestissimo

Composer ist kaum für seine Geschwindigkeit oder Ressourceneffizienz bekannt. Einer der Gründe dafür ist die sequentielle Natur des Installationsbefehls. Nachfolgende Bibliotheken werden nacheinander heruntergeladen und im Falle von Ausfallzeiten bewegt sich die Installation überhaupt nicht vorwärts und verlängert sich nur.

Um diese Einschränkung zu überwinden, aktivieren Sie das Prestissimo-Plugin (https://github.com/hirak/prestissimo). Es ermöglicht Composer, parallele Downloads durchzuführen. Dank dieses Plugins wird selbst das komplexeste Projekt mehrere Male schneller installiert als zuvor.

composer global require hirak/prestissimo

Was sind die potenziellen Nachteile von Prestissimo? Zuallererst kann es einige Probleme mit privaten Repositories geben (Sie müssen die notwendigen Tokens und Schlüssel in der Datei auth.json definieren) und zweitens – ab Version 2.0 von Composer wird das Plugin redundant – es wird durch die Unterstützung von curl-multi ersetzt.

3. Reduzieren Sie Composers Speicherhunger mit Drupal-Optimierungen

Im vorherigen Tipp habe ich von Composers... Liebe zu RAM gesprochen. Im Falle von Drupal wird dieses Phänomen durch eine Vielzahl externer Abhängigkeiten, insbesondere von Symfony, weiter verstärkt. Dieses Problem wurde bereits von den Symfony- und Drupal-Gemeinschaften bemerkt. Die Lösung in Form eines Composer-Plugins wurde von Jakub Piasecki, einem polnischen Entwickler, konzipiert und entwickelt.

Um Drupal-Optimierungen zu Ihrem Projekt hinzuzufügen, führen Sie Folgendes aus:

composer require zaporylie/composer-drupal-optimizations:^1.1

Wie funktioniert das Plugin? Es geht davon aus, dass Sie Drupal Version >= 8.5 verwenden. Basierend auf dieser Annahme vermeidet es das Überprüfen älterer Tags in Symfony-Komponenten-Repositories. Die Optimierung von Composer auf diese Weise reduziert den Speicherverbrauch auf weniger als ein Drittel, zumindest laut dem Autor des Plugins. Dadurch wird der Befehl composer update viel schneller ausgeführt.

4. Kontrollieren Sie das verfügbare Speicherkontingent

Wenn die beiden oben genannten Plugins nicht ausreichen und Sie immer noch auf Probleme mit der Überschreitung des Speicherlimits stoßen, könnte die einzige Möglichkeit, das Problem zu lindern, darin bestehen, es zu erhöhen. Die offizielle Dokumentation bietet mehrere Möglichkeiten, dies zu tun. Composer versucht, das Limit bei jedem Start auf 1,5 GB zu erhöhen, aber selbst das ist oft nicht genug.

Wenn Composer auf eine Änderung des Limitwertes nicht reagiert, stellen Sie sicher, dass Sie die richtige Konfigurationsdatei bearbeiten – prüfen Sie zunächst, ob sie in der Liste enthalten ist, die nach dem Ausführen des Befehls php --ini angezeigt wird. Sie sollten auch sicherstellen, dass der Server, auf dem Sie Composer ausführen, einen so hohen Speicherverbrauch zulässt. Wenn Sie Probleme mit composer update haben, denken Sie daran, dass Sie es lokal mit einem höheren Limit ausführen und die Datei composer.lock generieren können, um dann composer install auf dem Server auszuführen – es wird definitiv viel weniger Ressourcen verbrauchen.

5. Entdecken Sie den Befehl outdated und die Option --dry-run

Die meisten Composer-Nutzer verwenden hauptsächlich die Befehle install und update. Dagegen ist nichts einzuwenden… Das gilt so lange, bis Sie mehr Kontrolle über den Aktualisierungsprozess benötigen. Wenn Sie herausfinden möchten, was der Befehl composer update tun wird, führen Sie ihn mit der Option --dry-run aus. Wie der Name schon sagt, wird er dann „trocken“ laufen, ohne Änderungen am Code vorzunehmen.

Eine weitere Möglichkeit, die verfügbaren Updates anzuzeigen, ist das Ausführen des Befehls composer outdated. Er bietet einen klaren Überblick über alle Pakete, die aktualisiert werden müssen (für Pakete mit neueren Versionen, die durch Einschränkungen in composer.json blockiert sind, wird eine separate Farbe verwendet). Dies ist eine großartige Alternative zum Update-Manager-Modul.

6. Konvertieren Sie Ihr Projekt mit Composerize

Wenn Sie bereits ein Drupal-Projekt haben, das nicht mit Composer gepflegt wird, keine Sorge! Sie können mehrere Tools verwenden, die basierend auf dem im jeweiligen Projekt gefundenen Code eine composer.json-Datei generieren können. Das am häufigsten verwendete Plugin? Das wäre grasmash/composerize-drupal. Sie können es installieren, indem Sie folgenden Befehl ausführen:

composer global require grasmash/composerize-drupal

Nach dem Ausführen der folgenden Befehle (vorausgesetzt, dass [repo-root] der Pfad zum Projektstammverzeichnis ist und [drupal-root] der Pfad zu index.php ist) erhalten Sie eine composer.json-Datei, die alle Module, Themen und Profile im Projekt enthält, konfiguriert zur Handhabung von Patches und zum Herunterladen von Paketen von https://asset-packagist.org/.

cd path/to/drupal/project/repo
composer composerize-drupal --composer-root=[repo-root] --drupal-root=[drupal-root]

Das Ausführen von composer install wird die neuesten Versionen der Module installieren und die aktuellen ersetzen. Von diesem Zeitpunkt an müssen externe Abhängigkeiten nicht mehr im Projekt-Repository gespeichert werden – legen Sie einfach die Dateien composer.json und composer.lock dort ab.

7. Erfahren Sie mehr über Asset Packagist

Composer wird hauptsächlich zur Verwaltung von PHP-Paketen verwendet; es kann jedoch auch mit NPM- und Bower-Repositories arbeiten. Das ist besonders nützlich, wenn Sie die neuesten Versionen von Frontend-Bibliotheken (wie Colorbox oder Slick) pflegen möchten. Dies wird durch das Asset Packagist Projekt (https://asset-packagist.org/) ermöglicht.

Um zusätzliche Bibliotheken verwenden zu können, definieren Sie ein neues Repository in composer.json:

"repositories": [
    {
        "type": "composer",
        "url": "https://asset-packagist.org"
    }
]

Bedenken Sie, den Standort der Bibliotheken in einen zu ändern, der mit Drupal kompatibel ist. Stellen Sie dazu sicher, dass Ihr Projekt das composer/installers-Add-on enthält:

composer require composer/installers

Fügen Sie dann die folgenden Einträge im Bereich "extras" von composer.json hinzu:

"extra": {
    "installer-types": ["bower-asset", "npm-asset"],
    "installer-paths": {
      "web/libraries/{$name}": ["type:bower-asset", "type:npm-asset"]
    }
}

Nehmen wir an, Sie möchten Colorbox auf Ihrer Website hinzufügen. Zunächst müssen Sie es unter https://asset-packagist.org/ finden, dann auf seinen Titel klicken und warten, bis Asset Packagist Informationen über Colorbox in sein Repository herunterlädt (dieser Schritt ist nicht immer notwendig, er kann bei weniger beliebten Bibliotheken erforderlich sein).

Kopieren Sie den vollständigen Paketnamen mit dem npm-asset/bower-asset Präfix und führen Sie folgenden Befehl aus:

composer require npm-asset/jquery-colorbox

Wenn alles gut geht, wird Colorbox im web/libraries-Verzeichnis Ihres Projekts hinzugefügt.

Eine wichtige Sache über Asset Packagist – ich muss darauf hinweisen, dass seine Verwendung nur dann sinnvoll ist, wenn Sie eine einzelne Bibliothek ohne zusätzliche Abhängigkeiten in genau der Form und Gestalt, die im Repository gefunden wurde, in das Projekt herunterladen müssen. Composer wird nicht in der Lage sein, npm install colorbox zu ersetzen, das zusätzlich zu Colorbox mehrere Dutzend bis mehrere Hundert Abhängigkeiten herunterlädt und installiert. Dieser Ansatz hat einige Vor- und Nachteile. Einer der Hauptvorteile ist, dass Sie Speicherplatz sparen und unnötige Dateien nicht herunterladen müssen. Einer der größten Nachteile ist, dass Sie den aus NodeJS abgeleiteten Code nicht selbst kompilieren können. Mit anderen Worten, das Aktualisieren von Frontend-Bibliotheken wird einfacher, aber Sie zahlen dafür mit dem Verlust der Fähigkeit, sie selbst zu kompilieren.

8. Haben Sie keine Angst, Cweagan's Patches zu verwenden

Die Verwendung von .patch-Dateien ist in Drupal üblich und hat eine extrem lange Geschichte. Composer macht es einfach, Patches zu verwalten und deren erweiterte Sätze zu kontrollieren. Fangen wir mit einem Befehl an, um das Cweagan's Patches-Plugin zum Projekt hinzuzufügen:

composer require cweagans/composer-patches

Fügen Sie die notwendige Konfiguration in composer.json hinzu:

"patches": {
    "drupal/core": {
        "Alles reparieren": "patches/core_fix_everything.patch",
        "Noch etwas reparieren": "https://www.drupal.org/files/issues/fix-one-more.patch"
    },
    "drupal/colorbox": {
        "Etwas reparieren": "patches/colorbox_fix_something.patch",
    }
}

Patch-Dateien können sich sowohl in Ihrem Repository als auch irgendwo online befinden. Weitere Konfigurationsoptionen finden Sie in der Dokumentation unter https://github.com/cweagans/composer-patches. Alle Patches aus der obigen Liste werden automatisch auf die Originaldateien angewendet, wenn Sie das nächste Mal composer update ausführen.

Was sind die Vorteile der Verwendung von Cweagan's Patches? Vor allem werden Sie jetzt alle Patches an einem Ort haben und können das manuelle Anwenden vergessen – Composer kümmert sich darum. Sie müssen jedoch sicherstellen, dass die in den Patches enthaltenen Änderungen nicht bereits in neueren Versionen der aktualisierten Pakete enthalten sind.

9. Ein bisschen Paranoia hat noch keinen Drupal-Entwickler umgebracht

Drupal ist ein sicherheitsorientiertes Projekt, aber gleichzeitig kann seine Architektur eine Quelle einiger potenzieller Risiken sein. Dies betrifft in erster Linie die Verzeichnisstruktur, die Sie zwingt, zu viele Dateien mit PHP-Code im Web-Stammverzeichnis abzulegen – dem öffentlichen Verzeichnis, das von außen zugänglich ist. Trotz der Tatsache, dass eine ordnungsgemäße Konfiguration die Möglichkeit des Lesens dieses Codes ausschließt, zielen moderne Praktiken – hauptsächlich gefördert von Symfony – darauf ab, Dateien, die für den Endverbraucher bestimmt sind, im Web-Stammverzeichnis zu belassen.

Die Integration von Drupal mit Composer hat neue Möglichkeiten eröffnet, PHP-Dateien vor versehentlichem Zugriff zu schützen. Theoretisch können alle Pfade heruntergeladener Bibliotheken frei geändert werden, da Autoload ihre Auffindung übernimmt. Der Extremfall der Nutzung dieser Composer-Funktionalität ist die Vorlage https://github.com/drupal-composer/drupal-paranoia. Sie zwingt alle Projektdateien in einem separaten /app-Verzeichnis zu speichern, wobei nur Symlinks zu Ressourcen wie index.php oder sites/*/files Verzeichnissen der Außenwelt zugänglich gemacht werden.

Natürlich erfordert die Verwendung dieses Ansatzes ein *nix-System.

10. Optimieren Sie Ihre Produktionsversion

Es gibt einige grundlegende Regeln zur Verwendung von Composer in einer Produktionsumgebung. Die Einhaltung dieser Regeln erhöht die Sicherheit Ihrer Website und beschleunigt sie:

  • Verwenden Sie in der Produktionsumgebung nur den Befehl composer install und stellen Sie sicher, dass composer.lock immer im Repository ist. Wenn Sie zulassen, dass composer update ausgeführt wird, könnten Sie einige unvorhergesehene Konsequenzen erleben. Sie sollten Updates immer in einer Entwicklungsumgebung durchführen – dieser Ansatz ermöglicht es Ihnen, Probleme mit Inkompatibilitäten neuer Versionen zu vermeiden.
  • Verwenden Sie die Option composer install --no-dev, um die Installation von Entwicklungslibraries zu stoppen. Diese sind im Abschnitt require-dev von composer.json deklariert.
  • Verwenden Sie die Option composer install --optimize-autoloader, um eine Klassenkarte zu erstellen. Dank dieser wird der Autoloader nicht nach Dateien auf der Festplatte nach PSR-4/PSR-0-Regeln suchen, sondern erhält anhand des Klassennamens einen Pfad zu einer Datei mit ihrer Definition. Die Aktivierung dieser Optimierung in der Entwicklungsumgebung ist problematisch, da es erforderlich ist, den Cache nach jeder Änderung in der Projektdateistruktur zu löschen.
3. Best practices for software development teams