Pour une lecture rapide des principaux points à retenir, continuez à faire défiler le texte. Nous avons utilisé ChatGPT pour améliorer la grammaire et la syntaxe.
Lorsque vous utilisez une plateforme orientée développeur depuis plus d'une décennie, votre outillage a tendance à accumuler un certain bagage. Nous nous sommes retrouvés avec une interface de ligne de commande (CLI) entièrement implémentée en PHP - un choix naturel à l'époque, étant donné nos liens étroits avec les écosystèmes PHP et Drupal. Cependant, au fur et à mesure que notre public et les langages pris en charge s'élargissaient, nous avons réalisé que nous devions repenser la façon dont notre CLI était construite et distribuée.
Le résultat ? Un CLI hybride qui intègre la logique de notre CLI PHP existante dans un nouveau binaire basé sur Go, associé à Symfony Console pour un routage cohérent des commandes, l'autocomplétion et les raccourcis. Voici notre histoire, comment nous sommes arrivés là, pourquoi nous avons pris certaines décisions, et ce que nous avons appris en cours de route.
À l'origine, notre CLI était écrit en PHP, ce qui convenait parfaitement à notre principale base d'utilisateurs de l'époque. Au fur et à mesure de notre croissance, les technologies de nos utilisateurs se sont développées : Node.js, Python, Go, Ruby, Symfony, etc. Nous devions fournir une expérience CLI aux équipes qui n'avaient peut-être pas installé PHP - et qui ne voulaient pas non plus l'installer juste pour exécuter un outil.
Les objectifs clés qui nous ont poussés à reconsidérer notre approche CLI:
Go est largement utilisé dans l'écosystème des outils de développement (par exemple, Docker, Terraform et d'innombrables autres outils en ligne de commande). Il se compile en un seul binaire statique qui s'exécute rapidement et est facile à distribuer pour Linux, macOS et Windows. Telles étaient nos principales motivations :
Nous avions encore besoin de tout notre code PHP existant - des milliers de lignes de logique - disponible pour les utilisateurs. Mais comment l'exécuter à l'intérieur d'un binaire Go sans avoir besoin d'un PHP séparé sur la machine de l'utilisateur ?
Cette configuration nous a permis de ne pas avoir à réécrire immédiatement toutes les commandes existantes. En intégrant PHP, tout continuait à fonctionner, mais nous pouvions toujours ajouter de nouvelles fonctionnalités en Go sans retarder la sortie de la version complète.
Nous nous sommes appuyés sur Symfony Console dans notre CLI original basé sur PHP pour les arguments, les raccourcis et l'autocomplétion. Nous voulions conserver cette expérience utilisateur familière - des raccourcis comme p:init
pour project:init
, ou des textes d'aide bien structurés, etc.
Il s'avère que le CLI officiel de Symfony est écrit en Go, et qu'il inclut un composant Symfony Console basé sur Go. En remplaçant notre ancienne bibliothèque Go (Cobra) par cette Console Symfony pour Go, nous avons gagné :
project:init
, validate
) dans le nouveau code Go.Bien sûr, maintenir deux bases de code (le PHP intégré pour les anciennes commandes et le nouveau code Go) demande du travail supplémentaire. Mais cela nous donne aussi la liberté d'avancer à notre propre rythme, en nous assurant que chaque fonctionnalité est testée en profondeur sans forcer une réécriture massive.
Nous n'avons jamais voulu interrompre les flux de production des développeurs :
Nous migrons régulièrement d'autres commandes vers Go, en particulier celles qui requièrent une authentification. Une fois cette étape franchie, nous pourrons unifier la gestion des identifiants et des jetons dans le nouveau binaire, ce qui pourrait améliorer la gestion des clés SSH et l'intégration du stockage sécurisé. Nous explorons également les moyens de permettre aux développeurs tiers d'étendre la CLI, maintenant que la base de code est plus modulaire.
La réécriture d'un CLI mature est rarement simple, surtout lorsque des milliers de développeurs s'y fient quotidiennement pour leurs flux de production. En adoptant une architecture hybride, nous avons conservé les fonctionnalités existantes basées sur PHP, amélioré considérablement la distribution (un seul binaire, pas de dépendances linguistiques) et jeté les bases de futures extensions en Go.
Principaux enseignements:
Nous espérons que ce voyage vous inspirera si vous êtes confronté à un dilemme similaire : héritage contre futur. Que vous exploriez de nouveaux langages, de nouveaux modèles de distribution ou des moyens d'unifier l'expérience de vos développeurs, un CLI hybride pourrait être exactement ce dont votre équipe a besoin.