Wenn Sie die wichtigsten Erkenntnisse schnell durchlesen möchten, scrollen Sie bitte weiter, um unseren destillierten Bericht zu lesen. Wir haben ChatGPT verwendet, um die Grammatik und Syntax zu verbessern.
Wenn man seit über einem Jahrzehnt eine entwicklerorientierte Plattform betreibt, neigt das Tooling dazu, sich mit der Zeit anzusammeln. Wir hatten eine Befehlszeilenschnittstelle (CLI), die vollständig in PHP implementiert war - angesichts unserer starken Verbindungen zum PHP- und Drupal-Ökosystem eine ganz natürliche Wahl zu diesem Zeitpunkt. Als sich jedoch unsere Zielgruppe und die unterstützten Sprachen vergrößerten, wurde uns klar, dass wir die Art und Weise, wie unsere CLI entwickelt und verteilt wurde, überdenken mussten.
Und das Ergebnis? Eine hybride CLI, die unsere bestehende PHP-CLI-Logik in ein neues Go-basiertes Binary verpackt und mit der Symfony Console für konsistentes Befehlsrouting, Autovervollständigung und Shortcuts kombiniert. Im Folgenden erfahren Sie, wie wir zu diesem Ziel gekommen sind, warum wir bestimmte Entscheidungen getroffen haben und was wir auf unserem Weg gelernt haben.
Ursprünglich war unsere Befehlszeilenschnittstelle in PHP geschrieben, was für unsere damalige Hauptbenutzergruppe perfekt geeignet war. Als wir wuchsen, wuchsen auch die Tech-Stacks unserer Benutzer: Node.js, Python, Go, Ruby, Symfony und mehr. Wir mussten Teams, die PHP nicht installiert hatten, eine CLI-Erfahrung bieten - und sie wollten es auch nicht installieren, nur um ein Tool auszuführen.
Wichtige Ziele, die uns dazu brachten, unseren CLI-Ansatz zu überdenken:
Go ist im Ökosystem der Entwicklerwerkzeuge weit verbreitet (z. B. Docker, Terraform und unzählige andere Befehlszeilentools). Es lässt sich zu einer einzigen statischen Binärdatei kompilieren, die schnell ausgeführt werden kann und für Linux, macOS und Windows einfach zu verteilen ist. Dies waren unsere wichtigsten Beweggründe:
Unser gesamter PHP-Code - tausende von Zeilen an Logik - muss den Benutzern weiterhin zur Verfügung stehen. Aber wie können wir diesen Code in einer Go-Binärdatei ausführen, ohne dass ein separates PHP auf dem Rechner des Benutzers erforderlich ist?
Durch diese Vorgehensweise mussten wir nicht alle bestehenden Befehle sofort umschreiben. Durch die Einbettung von PHP funktionierte alles weiter, aber wir konnten trotzdem neue Funktionen in Go hinzufügen, ohne die gesamte Veröffentlichung aufzuhalten.
In unserem ursprünglichen PHP-basierten CLI haben wir uns für Argumente, Shortcuts und Autovervollständigung auf die Symfony Console verlassen. Wir wollten diese vertraute Benutzererfahrung beibehalten - Abkürzungen wie p:init
für project:init
, oder gut strukturierte Hilfetexte, usw.
Es stellte sich heraus, dass die offizielle Symfony CLI in Go geschrieben ist und eine Go-basierte Symfony Console Komponente enthält. Indem wir unsere vorherige Go-Bibliothek (Cobra) mit dieser Symfony Console für Go austauschten, gewannen wir:
project:init
, validate
) in den neuen Go-Code aufgenommen.Natürlich bedeutet die Pflege von zwei Codebasen (das eingebettete PHP für die alten Befehle und der neue Go-Code) zusätzliche Arbeit. Aber es gibt uns auch die Freiheit, in unserem eigenen Tempo zu arbeiten und sicherzustellen, dass jede Funktion gründlich getestet wird, ohne dass wir sie im großen Stil umschreiben müssen.
Wir wollten die Produktionsabläufe der Entwickler nicht unterbrechen:
Wir migrieren nach und nach weitere Befehle auf Go, insbesondere solche, die eine Authentifizierung erfordern. Sobald dies abgeschlossen ist, können wir die Verwaltung von Anmeldeinformationen und Token in der neuen Binärdatei vollständig vereinheitlichen und möglicherweise die Handhabung von SSH-Schlüsseln und die Integration sicherer Speicher verbessern. Wir untersuchen auch Möglichkeiten, wie Entwickler von Drittanbietern die CLI erweitern können, da die Codebasis jetzt modularer ist.
Eine ausgereifte Befehlszeilenschnittstelle neu zu schreiben ist selten einfach - vor allem dann nicht, wenn sich Tausende von Entwicklern bei ihren Produktionsabläufen täglich auf sie verlassen. Durch die Einführung einer hybriden Architektur konnten wir die vorhandenen PHP-basierten Funktionen beibehalten, die Verteilung drastisch verbessern (eine einzige Binärdatei, keine Sprachabhängigkeiten) und eine Grundlage für zukünftige Erweiterungen in Go schaffen.
Die wichtigsten Erkenntnisse:
Wir hoffen, dass diese Reise Sie inspirieren kann, wenn Sie vor einem ähnlichen Dilemma zwischen Vergangenheit und Zukunft stehen. Ganz gleich, ob Sie neue Sprachen, neue Distributionsmodelle oder Möglichkeiten zur Vereinheitlichung Ihrer Entwicklererfahrung erforschen, eine hybride CLI könnte genau das sein, was Ihr Team braucht.