Heim > Backend-Entwicklung > Golang > CLIs entwickeln

CLIs entwickeln

PHPz
Freigeben: 2024-08-13 06:48:11
Original
787 Leute haben es durchsucht

Developing CLIs

Das Erstellen von CLI-Funktionen läuft oft auf Folgendes hinaus:

  • Neue API-Endpunkte veröffentlichen.
  • Erstellen Sie neue CLI-Aktionen, die die API-Änderungen erfordern.
  • Erkennen Sie, dass in der API, die Sie gerade veröffentlicht haben, Fehler gemacht wurden.
  • Versuchen Sie, die API für diese Funktion zu reparieren, ohne in Zukunft weitere Probleme zu verursachen.
  • Versuchen Sie sich daran zu erinnern, was Sie mit der CLI erreichen wollten, und erreichen Sie es dann tatsächlich.  
  • GOTO: Erkenne, dass Fehler gemacht wurden.

Jeder Schritt erfordert den vorherigen und ups, wir haben das Wasserfall-Projektmanagement neu erfunden. Sie werden von dem Schmerz zermürbt, der versucht, Fehler anmutig zu überbrücken, bis Sie funktionsfähig werden, sich aber lange vor dem Ausnahmezustand verabschieden. Und lassen Sie mich nicht damit anfangen, die resultierende Ansammlung von Ad-hoc-„Korrekturen“ und Warzen aufrechtzuerhalten.

Ich war dort und habe das getan. Wir wussten, dass wir den wasserfallartigen Ansatz hinter uns lassen mussten.

Hier ist die Geschichte, wie wir dorthin gelangt sind und einige der Tools, die uns dabei geholfen haben.

Der Start war lückenhaft

Wir wollten eine kostengünstige und schnelle Iteration, bis wir die Funktion verstanden haben, und uns erst dann auf eine teure Implementierung und langfristigen Support festlegen. Als kleines Team habe ich diesen Prozess oft Ende für Ende durchgeführt und wollte mich nacheinander auf jeden Teil konzentrieren. Wir wollten Implementierungsteile fälschen, bis wir uns sicher genug fühlten, es zu schaffen.

Um auf den Prozess zurückzukommen: Er beginnt mit dem Vorschlagen von Funktionen. Wir wollten aus dem Abstrakten herauskommen, aber nicht, wenn dies eine unausgegorene Umsetzung bedeutete. Wir haben es mit „Skizzen“ vorgetäuscht, inspiriert vom Google Docs CLI-Skizzen-Ansatz, den Github hier beschreibt.

Leider haben uns die statischen Skizzen nicht ganz das gewünschte Feedback gegeben. Unsere CLI verändert die Ausgabe im Laufe der Zeit und ähnelt eher einer Animation als einer Zeichnung. Um eine höhere Wiedergabetreue zu erreichen, habe ich kleine Ruby-Programme geschrieben, die grundlegende Eingaben aufnehmen und darauf reagieren, indem sie entsprechende vorgefertigte Antworten ausdrucken.

Seitdem haben wir eine noch bessere Möglichkeit gefunden, animierte CLI-Ausgaben zu erfassen, aber um das zu erklären, ist ein kleiner Umweg erforderlich.

Testen Sie überhaupt?

Als wir mit der Ausarbeitung unserer CLI begannen, wollten wir auch Grenzfälle testen und Regressionen erkennen. Ich habe öffentliche CLIs auf Cobra/Bubbletea-Basis untersucht, um nach Ideen zu suchen, und habe frustrierend wenige Tests gefunden. Dann stießen wir zufällig auf den Teetest von Charm, der uns einen Anhaltspunkt gab.

Teatest konzentriert sich auf goldene Tests, bei denen ein bekanntermaßen gutes Ergebnis erfasst und dann bestätigt wird, dass zukünftige Ergebnisse weiterhin damit übereinstimmen. Das brachte uns wieder einmal zurück zur High-Fidelity-Erfassung animierter CLI-Ausgaben. Teatest brachte uns auf die großartige Idee einer rahmenbasierten Lösung, etwa eines Daumenkinos, auf der wir aufgebaut haben:

─── SigninHeader ───────────────────────────────────────────────────────────────
# Signin To Your CLI Account `cli auth signin`
─── SigninInput --──────────────────────────────────────────────────────────────
# Signin To Your CLI Account `cli auth signin`
    ? What is your username?
    ? user
─── SigninInput ────────────────────────────────────────────────────────────────
# Signin To Your CLI Account `cli auth signin`
    * Signing in to your CLI account… ⠋
─── SigninInput ────────────────────────────────────────────────────────────────
# Signin To Your CLI Account `cli auth signin`
    * Signed in to your CLI account: user@example.com
Nach dem Login kopieren

Dieses vereinfachte Beispiel zeigt, wie eine goldene Ausgabe für einen einfachen Autorisierungsbefehl aussehen könnte. Die horizontalen Linien grenzen Rahmen ab, wobei Beschriftungen das aktive Modell angeben. Zusammengenommen erhalten wir eine hochauflösende Erfassung der Ausgabe, selbst wenn Zeilen hinzugefügt, entfernt oder ersetzt werden.

Wir verwenden in unserer Testsuite ein Flag, um Dateien mit den goldenen Ausgaben zu aktualisieren. Andernfalls schlagen die Tests fehl, wenn die Ausgabe nicht mit den Dateien übereinstimmt. Dies hält uns über Ausgabeänderungen auf dem Laufenden und erleichtert PR-Überprüfungen, indem es uns ermöglicht, zu verstehen, wie die Ausgabe aussehen sollte und ob sie sich geändert hat. Es gefällt uns so gut, dass wir planen, unsere Skizzenprogramme durch die Ausgabe im Golden-Style in Google Docs im Github-Stil zu ersetzen, damit wir sowohl Animations- als auch Stilideen erfassen können.

Mit unseren einmaligen und zukünftigen Skizzen in der Hand kehren wir zu den ersten Schritten mit neuen API-Endpunkten zurück.

API und CLI gemeinsam entwerfen

Wir arbeiten gleichzeitig an der API und der CLI, da die besten Designs dafür aus einer engen Integration entstehen. Wir sind in der Lage, dies zu tun und gleichzeitig die Gefahren des Wasserfalls zu vermeiden, indem wir Entwürfe in günstigeren Kontexten iterieren und mit der Umsetzung warten, bis sich die Anforderungen verfestigen. Für unsere APIs bedeutet das das Skizzieren mit OpenAPI:

openapi: 3.1.0
info:
  contact:
    email: contact@example.com
  description: An example API.
  title: Example API
  version: 0.0.1
servers:
  - url: https://api.example.com
tags:
  - description: account operations
    name: account
paths:
  '/v0/auth/signin':
    post:
      description: Signin to CLI.
      operationId: auth_signin
      responses:
        '200':
          content:
            'application/json':
              schema:
                additionalProperties: false
                properties:
                  email:
                    description: Email address for authenticated user.
                    example: username@example.com
                    type: string
                required:
                  - email
                type: object
          description: Successful signin.
      summary: Signin to CLI.
      tags:
        - account
Nach dem Login kopieren

Dieses vereinfachte Beispiel zeigt, wie ein Schema für einen grundlegenden Autorisierungsbefehl aussehen könnte. Wir verwenden den Spektral-Linter, um die Arbeit an diesen Dateien zu vereinfachen.

Mit einer Skizze in der Hand verwenden wir Prisma dann als simulierten API-Server, während wir die CLI implementieren. Wenn wir unweigerlich feststellen, dass Fehler gemacht wurden, können wir einfach die Spezifikation optimieren und zu unserer CLI-Iteration zurückkehren. Die Arbeit auf diesem hohen Niveau ermöglicht es uns, die API und die CLI gemeinsam weiterzuentwickeln und die kostspielige Implementierung aufzuschieben, bis wir bessere Kenntnisse haben.

APIs implementieren

Wir stützen uns auch auf unsere OpenAPI-Spezifikation, um bei der Implementierung mithilfe des Ausschusses ehrlich zu bleiben. affirm_schema_conform testet die Ausrichtung und die Middleware benachrichtigt uns über alle Live-Diskrepanzen. Diese ermöglichen zusammen eine Rot-Grün-Umsetzung und schützen uns gleichzeitig vor Rückschritten.

Testen mit Mocks und Proxys

Um das Ganze abzurunden, verwendet unsere Testsuite Flags, um Prism entweder im Mock- oder Proxy-Modus auszuführen. Durch die Verwendung von Flags können wir uns auf das Schreiben nur einer Art von Tests konzentrieren, obwohl dies bedeutet, dass wir einige Tests in dem einen oder anderen Modus überspringen. Wir verwenden Mock-Tests wegen ihrer Geschwindigkeit und unter Windows und macOS, wo unser vollständiger Stack nicht in CI läuft. Mit unseren Proxy-Tests können wir Tests für unseren gesamten Stack ausführen, indem wir einfach ein Flag hinzufügen. So können wir ganz einfach End-to-End-Tests durchführen, wann immer wir es für notwendig halten.

Alles zusammenbringen

Skizzen und Spezifikationen helfen uns, über die Zusammenfassung hinaus zu iterieren, ohne uns bei der Umsetzung zu verzetteln. Dann helfen uns Mocks und Proxys dabei, sicherzustellen, dass die Implementierungen mit den Skizzen übereinstimmen. Durch die kontinuierliche Iteration unseres Prozesses verursacht jede Funktion weniger Probleme, was wir beim Aufbau der Teams-Erfahrung, die wir später in diesem Monat liefern werden, sehr zu schätzen wissen.

Wir werden unseren Prozess weiter wiederholen. Ich hoffe, dass Sie etwas daraus gelernt haben, und ich würde gerne von Ihnen lernen. Was haben Sie versucht, worauf sind Sie stolz und was bleibt frustrierend?

Das obige ist der detaillierte Inhalt vonCLIs entwickeln. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage