Blog
CLI-Anwendungen in Go - unterhaltsam, effektiv und sehr einfach zu erstellen

In früheren Blogs über Go haben wir uns die Programmiersprache Go angesehen und wie man Go in AWS Lambda ausführt. Wir haben auch gesehen, wie man Go-Code crosskompiliert, so dass er auf den Plattformen Linux, Mac und Windows läuft. Wir haben uns auch das AWS SDK für Go angesehen, mit dem sich Go-Anwendungen ganz einfach in die gesamte Palette der AWS-Services integrieren lassen. Dieses Mal werden wir Anwendungen für die Befehlszeilenschnittstelle (CLI) in Go erstellen. Lassen Sie uns loslegen!
Kommandozeilen-Anwendungen
Command Line Interface (CLI)-Anwendungen sind winzige Anwendungen mit einem ganz bestimmten Schwerpunkt. Diese Anwendungen werden oft als 'Tools' bezeichnet und helfen uns bei gängigen Vorgängen, die wir oft automatisieren möchten. Wenn wir uns die Kommandozeilenanwendungen genauer ansehen, sehen wir, dass diese Anwendungen um Befehle, Argumente und Flags herum strukturiert sind. Befehle stehen für Aktionen/Verben, Args sind Dinge/Namen/Objekte und Flags sind Modifikatoren/Adjektive (Eigenschaft/Zustand) für Aktionen.
Zum Beispiel:
# action thing/object property/state
$ myapp verb noun --adjective
# action thing/object state
$ git clone git@github.com:binxio/cfn-certificate-provider.git --bare
# action thing/object
$ go get -u github.com/aws/aws-sdk-go/...
Kobra
Um CLI-Anwendungen zu erstellen, werden wir Cobra verwenden, eine Bibliothek zur Erstellung leistungsstarker moderner CLI-Anwendungen. Cobra wird von beliebten Go-Projekten wie Kubernetes, Docker, OpenShift, Hugo und anderen verwendet, um ihre CLI-Schnittstellen zu erstellen. Wenn Sie also das nächste Mal 'docker run -it ubuntu' eingeben, wissen Sie, dass Cobra dahintersteckt!
Code Generator
Cobra wird mit einem Code-Generator/Scaffold geliefert, der durch Eingabe von cobra gestartet werden kann. Cobra macht es sehr einfach, CLI-Anwendungen zu erstellen, da es gängige Operationen wie die Initialisierung einer neuen Projektstruktur, die Bootstrap-Code enthält, und das Hinzufügen von Befehlen, die Skeleton-Code enthalten, unterstützt. Der Befehl init erstellt ein neues Projekt und der Befehl add fügt der Anwendung neue Befehle hinzu.
Cobra installieren
So installieren Sie den Typ Cobra:
$ go get github.com/spf13/cobra/cobra
$ cobra --help
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.
...
Greeter erstellen
Lassen Sie uns eine 'Greeter'-App erstellen, die eine Begrüßungsnachricht auf der Konsole ausgibt.
$ cobra init --author "Dennis Vriend" --license apache github.com/dnvriend/greeter
Der Befehl erstellt die folgende Verzeichnisstruktur mit einer Apache2-Lizenzdatei, einer 'main.go'-Datei, die die CLI-Anwendung bootet, und einem einzigen 'root.go'-Befehl im 'cmd'-Paket. Der Befehl root ist ein Container für Befehle. Wir haben noch keine Befehle hinzugefügt.
.
├── LICENSE
├── cmd
│ └── root.go
└── main.go
Lassen Sie die Anwendung laufen:
$ go run github.com/dnvriend/greeter
A longer content that spans multiple lines and likely contains
examples and usage of using your application. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.
Die Ausgabe erfolgt über den Text, der mit dem Befehl 'root.go' konfiguriert wurde. Lassen Sie uns einen Befehl hinzufügen.
Begrüßungsbefehl hinzufügen
$ cobra add greet -t github.com/dnvriend/greeter
Wir haben jetzt die folgende Verzeichnisstruktur:
.
├── LICENSE
├── cmd
│ ├── greet.go
│ └── root.go
└── main.go
Der Befehl 'greet.go' wurde hinzugefügt. Lassen Sie uns die Anwendung ausführen:
$ go run github.com/dnvriend/greeter
A longer content that spans multiple lines and likely contains
examples and usage of using your application. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.
Usage:
greeter [command]
Available Commands:
greet A brief content of your command
help Help about any command
Flags:
--config string config file (default is $HOME/.greeter.yaml)
-h, --help help for greeter
-t, --toggle Help message for toggle
Use "greeter [command] --help" for more information about a command.
$ go run github.com/dnvriend/greeter greet
greet called
Die Nachricht ist ziemlich langweilig. Bearbeiten wir die Datei greet.go:
package cmd
import (
"fmt"
"strings"
"github.com/spf13/cobra"
)
var greetCmd = &cobra.Command{
Use: "greet",
Short: "Prints a greet message",
Long: Prints a greet message,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Hello World! " + strings.Join(args, " "))
},
}
func init() {
rootCmd.AddCommand(greetCmd)
}
Lassen Sie den 'Greeter' laufen:
$ go run github.com/dnvriend/greeter greet a b c
Hello World! a b c
Hinzufügen einer Flagge
Fügen wir das Flag 'name' zum Befehl 'greet' hinzu. Dazu müssen wir die Datei 'greet.go' bearbeiten und das Flag 'name' zur greetCmd hinzufügen. Nachdem das Flag 'name' hinzugefügt wurde, kann das Flag im Run command handler abgefragt werden.
package cmd
import (
"fmt"
"github.com/spf13/cobra"
"strings"
)
var greetCmd = &cobra.Command{
Use: "greet",
Short: "Prints a greet message",
Long: Prints a greet message,
Run: func(cmd *cobra.Command, args []string) {
name := cmd.Flag("name")
if name.Value.String() == "" {
fmt.Printf("Hello World! %sn", strings.Join(args, " "))
} else {
fmt.Printf("Hello %s, %sn", name.Value.String(), strings.Join(args, " "))
}
},
}
func init() {
rootCmd.AddCommand(greetCmd)
greetCmd.Flags().StringP("name", "n", "", "The name to use")
}
Greeter ist nun fertig. Lassen Sie uns die Anwendung in den Ordner 'bin' installieren.
$ go install github.com/dnvriend/greeter
$ $GOPATH/bin/greeter greet --name "Dennis Vriend" a b c
Hello Dennis Vriend, a b c
Fazit
Mit Cobra können Sie leistungsstarke CLI-Anwendungen auf der Basis von Go erstellen. Cobra wird mit einem Code-Generator geliefert, mit dem Sie schnell CLI-Anwendungen starten können. Cobra bietet auch eine Bibliothek zur Implementierung von CLI-Anwendungen. Cobra bietet
Verfasst von
Dennis Vriend
Unsere Ideen
Weitere Blogs
Contact



