Frameworks CLI para Go: desde utilidades simples hasta interfaces TUI
Go (Golang) se ha convertido en el lenguaje número uno para crear utilidades de consola y herramientas DevOps. Gracias a su compilación rápida, soporte integrado de concurrencia y distribución simple (un solo archivo binario), Go es ideal para CLI. Sin embargo, escribir un analizador de argumentos, manejo de errores y salida de colores desde cero es una tarea laboriosa. Los frameworks CLI vienen al rescate. En este artículo, analizaremos tres herramientas clave: Cobra, urfave/cli y Bubble Tea.
1. Cobra — el estándar de la industria
Cobra (github.com/spf13/cobra) es el framework más popular para Go. Lo utilizan Kubernetes, Hugo, Docker, GitHub CLI. Cobra proporciona un potente generador de comandos, subcomandos anidados, autocompletado para bash/zsh/fish e integración con Viper (gestión de configuraciones).
Instalación
go get -u github.com/spf13/cobra/cobraEjemplo: aplicación simple con subcomandos
package main
import ( "fmt" "github.com/spf13/cobra")
func main() { var rootCmd = &cobra.Command{ Use: "app", Short: "Ejemplo de aplicación en Cobra", Run: func(cmd *cobra.Command, args []string) { fmt.Println("Manejador raíz ejecutado") }, }
var helloCmd = &cobra.Command{ Use: "hello [name]", Short: "Saludar al usuario", Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { fmt.Printf("¡Hola, %s!", args[0]) }, }
rootCmd.AddCommand(helloCmd) rootCmd.Execute()}Características clave:
- Generación automática de ayuda (--help)
- Soporte de banderas (persistentes, locales)
- Validación de argumentos
- Generación de scripts de autocompletado
- Integración con Viper para configuración
2. Urfave/cli — simplicidad y flexibilidad
Urfave/cli (github.com/urfave/cli/v2) es una alternativa ligera a Cobra. El framework es declarativo: describes comandos, banderas y acciones en estructuras. Ideal para utilidades pequeñas y medianas.
Instalación
go get github.com/urfave/cli/v2Ejemplo: utilidad para trabajar con archivos
package main
import ( "fmt" "log" "os" "github.com/urfave/cli/v2")
func main() { app := &cli.App{ Name: "fileutil", Usage: "utilidad para trabajar con archivos", Commands: []*cli.Command{ { Name: "read", Aliases: []string{"r"}, Usage: "leer un archivo", Action: func(cCtx *cli.Context) error { if cCtx.NArg() == 0 { return fmt.Errorf("especifique el nombre del archivo") } data, _ := os.ReadFile(cCtx.Args().First()) fmt.Println(string(data)) return nil }, }, { Name: "write", Aliases: []string{"w"}, Usage: "escribir una cadena en un archivo", Flags: []cli.Flag{ &cli.StringFlag{ Name: "content", Aliases: []string{"c"}, Usage: "contenido a escribir", }, }, Action: func(cCtx *cli.Context) error { content := cCtx.String("content") if content == "" { return fmt.Errorf("especifique --content") } return os.WriteFile(cCtx.Args().First(), []byte(content), 0644) }, }, }, }
if err := app.R También en la biblioteca
Geolocalización y mapas en Go (Golang): bibliotecas y ejemplos de código
Trabajo con S3 y almacenamiento en la nube en C# (.NET): biblioteca AWS SDK
Envío de Email en Swift: Guía Completa sobre SMTP y MailKit
Trabajo con CSV en C# (.NET): Guía Completa