Frameworks CLI para Go (Golang): creando aplicaciones de consola profesionales
Go (Golang) es considerado merecidamente uno de los mejores lenguajes para crear utilidades de consola. Gracias a su compilación rápida, soporte integrado de concurrencia y un conveniente sistema de paquetes, en Go se han escrito herramientas legendarias como Docker, Kubernetes, Hugo y Terraform. Sin embargo, para crear una CLI (Command Line Interface) realmente cómoda y flexible, a menudo se requiere no solo la biblioteca estándar flag, sino también frameworks especializados. En este artículo, analizaremos en detalle los mejores frameworks CLI para Go, sus capacidades, ventajas y ejemplos de uso.
¿Por qué necesito un framework CLI?
La biblioteca estándar flag maneja bien tareas simples, pero cuando su proyecto crece, surgen necesidades de:
- Soporte de subcomandos anidados, como en
git commitodocker run. - Generación automática de ayuda y páginas man.
- Autocompletado (bash/zsh/fish completion).
- Análisis de banderas y argumentos complejos.
- Modo de trabajo interactivo (TUI).
Para estas tareas existen los frameworks CLI.
1. Cobra — el rey de CLI en Go
Cobra es el framework más popular para crear CLI en Go. Se utiliza en Kubernetes, Hugo, GitHub CLI y muchos otros proyectos. Cobra proporciona una interfaz potente para crear comandos, banderas y argumentos.
Características clave:
- Creación sencilla de subcomandos anidados.
- Generación automática de ayuda y páginas man.
- Soporte de autocompletado para bash, zsh, fish y PowerShell.
- Integración con Viper (gestor de configuraciones).
- Generación del esqueleto del proyecto mediante
cobra-cli init.
Ejemplo de código con Cobra:
package main
import ( "fmt" "os"
"github.com/spf13/cobra")
func main() { var rootCmd = &cobra.Command{ Use: "greet", Short: "Utilidad de saludo", Long: "Una utilidad simple para saludar al usuario", Run: func(cmd *cobra.Command, args []string) { name, _ := cmd.Flags().GetString("name") if name == "" { name = "mundo" } fmt.Printf("¡Hola, %s!", name) }, }
rootCmd.Flags().StringP("name", "n", "", "Nombre del usuario")
if err := rootCmd.Execute(); err != nil { fmt.Println(err) os.Exit(1) }}Al ejecutar este programa con la bandera --name "Juan", obtendrá un saludo. Cobra agregará automáticamente la bandera --help y un bonito formato de salida.
2. urfave/cli (anteriormente codegangsta/cli)
urfave/cli es el segundo framework más popular. Se distingue por su API simple e intuitiva, orientada a la descripción declarativa de comandos. Es ideal para proyectos pequeños y medianos.
Ventajas:
- Código minimalista y comprensible.
- Soporte integrado de banderas, argumentos y subcomandos.
- Generación automática de ayuda.
- Soporte de acciones antes y después de la ejecución del comando (hooks Before/After).
Ejemplo de código con urfave/cli:
package main
import ( "fmt" "log" "os"
"github.com/urfave/cli/v2")
func main() { app := &cli.App{ Name: "calculator", Usage: "Calculadora simple", Commands: []*cli.Command{ { Name: "add", Aliases: []string{"a"}, Usage: "Suma de dos números",