https://github.com/spf13/cobra
Muchos proyectos famosos como Kubernetes, Docker, etc.usan Cobra para construir sus interfaces de línea de comandos.
Visión general
La biblioteca Cobra proporciona una interfaz simple para crear una poderosa interfaz de línea de comandos moderna similar a las herramientas git and go.
La función principal:
- CLI basada en subcomandos, como
app server
,app fetch
- Indicadores de parámetros en total conformidad con los estándares POSIX (se admiten indicadores largos y cortos)
- Subcomando anidado
- Banderas de parámetros globales, locales y en cascada
- Por
cobra init appname
ycobra add cmdname
compile aplicaciones y comandos - Mensaje inteligente (servidor de aplicaciones ... ¿quiso decir servidor de aplicaciones?)
- Genere automáticamente marcas de línea de comando y parámetros
- Reconocimiento automático
-h
,--help
etc. - Genere automáticamente el autocompletado de bash para el programa
- Genere automáticamente manuales de hombre para aplicaciones
- Alias de comando para modificar fácilmente el contenido sin dañarlo
- Definición flexible de su ayuda, uso, etc.
- Integración estrecha opcional con viper
Estructura de la línea de comandos
Una buena línea de comando debe ser similar a la humana. Las personas pueden entender cómo usar la aplicación leyendo la línea de comandos.
La línea de comando se compone principalmente de cuatro partes:
- APPNAME nombre de la aplicación, asunto
- Comandos, predicados
- Parámetro de comando Args, objeto
- Banderas parámetros de la bandera, cómo ejecutar la acción del comando set, atributivo / adverbial / complemento
Como:
git(主语) clone(谓语) URL(参数,宾语) --bear(参数,定语/状语/补语)
Usa Cobra
Estructura de código sugerida
▾ appName/
▾ cmd/
add.go
your.go
commands.go
here.go
main.go
Paquete de instalación
go get -u github.com/spf13/cobra/cobra
Usar parámetros de bandera (banderas)
Definir dos parámetros de bandera
var Verbose bool
var Source string
Las banderas (parámetros de la bandera) se dividen en dos categorías:
- Parámetros de marca persistentes (globales), también válidos para subcomandos de un comando
rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output")
- Parámetros de bandera local, solo válidos para el comando actual
localCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from")
Se recomienda ejecutar el comando root desde la función principal.
Ejemplo simple
Estructura de archivo
$ tree demo_cobra/
demo_cobra/
├── cmd
│ └── root.go
├── demo_cobra
└── main.go
main.go
package main
import (
"fmt"
"github.com/yourrepo/cmd"
"os"
)
func main() {
if err := cmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
cmd / root.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
"strings"
)
var (
verbose bool
rootCmd = &cobra.Command{
Use: "demo_cobra",
Short: "print flag parameters to screen",
Long: `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.`,
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
fmt.Println(strings.Join(args, " "))
},
}
cloneCmd = &cobra.Command{
Use: "clone [remote repo's url]",
Short: "clone remote repo",
Long: `clone copy a remote repository to your local storage`,
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
fmt.Print("you are cloning ", args[0])
if verbose == true {
fmt.Println(" with verbose")
}
},
}
)
func Execute() error {
return rootCmd.Execute()
}
func init() {
cloneCmd.Flags().BoolVarP(&verbose, "verbose", "v", false, "whether output the detail information")
rootCmd.AddCommand(cloneCmd)
}
resultado de la operación
$ go run main.go help clone
clone copy a remote repository to your local storage
Usage:
demo_cobra clone [remote repo's url] [flags]
Flags:
-h, --help help for clone
-v, --verbose whether output the detail information
$ go run main.go abc 123 haha
abc 123 haha
Cobra también puede definir varias funciones de gancho para la función Ejecutar
- PersistentPreRun
- Prerun
- correr
- PostRun
- PersistentPostRun
También se puede integrar con Viper para vincular valores de configuración de archivos de configuración, etc., lo cual es poderoso.