CLI-Frameworks für Go: Von einfachen Dienstprogrammen bis zu TUI-Oberflächen
Go (Golang) ist zur Sprache Nr. 1 für die Erstellung von Konsolendienstprogrammen und DevOps-Tools geworden. Dank schneller Kompilierung, integrierter Unterstützung für Nebenläufigkeit und einfacher Verteilung (eine einzige Binärdatei) ist Go ideal für CLI. Das Schreiben eines Argumentparsers, der Fehlerbehandlung und der farbigen Ausgabe von Grund auf ist jedoch eine mühsame Aufgabe. Hier helfen CLI-Frameworks. In diesem Artikel betrachten wir drei wichtige Werkzeuge: Cobra, urfave/cli und Bubble Tea.
1. Cobra – der Industriestandard
Cobra (github.com/spf13/cobra) ist das beliebteste Framework für Go. Es wird von Kubernetes, Hugo, Docker, GitHub CLI verwendet. Cobra bietet einen leistungsstarken Befehlsgenerator, verschachtelte Unterbefehle, Autovervollständigung für bash/zsh/fish und Integration mit Viper (Konfigurationsverwaltung).
Installation
go get -u github.com/spf13/cobra/cobraBeispiel: Einfache Anwendung mit Unterbefehlen
package main
import ( "fmt" "github.com/spf13/cobra")
func main() { var rootCmd = &cobra.Command{ Use: "app", Short: "Beispielanwendung mit Cobra", Run: func(cmd *cobra.Command, args []string) { fmt.Println("Stamm-Handler gestartet") }, }
var helloCmd = &cobra.Command{ Use: "hello [name]", Short: "Benutzer begrüßen", Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { fmt.Printf("Hallo, %s!", args[0]) }, }
rootCmd.AddCommand(helloCmd) rootCmd.Execute()}Wichtige Funktionen:
- Automatische Hilfegenerierung (--help)
- Unterstützung für Flags (persistent, lokal)
- Argumentvalidierung
- Generierung von Autovervollständigungsskripten
- Integration mit Viper für die Konfiguration
2. Urfave/cli – Einfachheit und Flexibilität
Urfave/cli (github.com/urfave/cli/v2) ist eine leichte Alternative zu Cobra. Das Framework ist deklarativ: Sie beschreiben Befehle, Flags und Aktionen in Strukturen. Ideal für kleine und mittlere Dienstprogramme.
Installation
go get github.com/urfave/cli/v2Beispiel: Dienstprogramm für die Dateiarbeit
package main
import ( "fmt" "log" "os" "github.com/urfave/cli/v2")
func main() { app := &cli.App{ Name: "fileutil", Usage: "Dienstprogramm für die Dateiarbeit", Commands: []*cli.Command{ { Name: "read", Aliases: []string{"r"}, Usage: "Datei lesen", Action: func(cCtx *cli.Context) error { if cCtx.NArg() == 0 { return fmt.Errorf("Dateiname angeben") } data, _ := os.ReadFile(cCtx.Args().First()) fmt.Println(string(data)) return nil }, }, { Name: "write", Aliases: []string{"w"}, Usage: "Zeichenfolge in Datei schreiben", Flags: []cli.Flag{ &cli.StringFlag{ Name: "content", Aliases: []string{"c"}, Usage: "Inhalt zum Schreiben", }, }, Action: func(cCtx *cli.Context) error { content := cCtx.String("content") if content == "" { return fmt.Errorf("--content angeben") } return os.WriteFile(cCtx.Args().First(), []byte(content), 0644) }, }, }, }
if err := app.R Auch in der Bibliothek
Reaktive Programmierung in Swift: Combine und RxSwift für iOS/macOS
QR-Code-Generator in Rust: Die Bibliothek qr_code
PDF-Generierung in JavaScript: Die Bibliothek PDFKit
ShareLink für Swift: Vollständige Anleitung mit Beispielen