Ir a aprender en la biblioteca: Cobra

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 appnamey cobra add cmdnamecompile 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, --helpetc.
  • 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.

Supongo que te gusta

Origin blog.csdn.net/qq_35753140/article/details/104600163
Recomendado
Clasificación