Instalación y estructura:
# Instalar Cobra
go get -u github.com/spf13/cobra
# Estructura del proyecto
/cmd
/root.go
/server.go
/config.go
/version.go
/main.go
Comando raíz:
// cmd/root.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
Use: "mi-cli",
Short: "Mi CLI tool",
Long: `Una herramienta CLI completa construida con Cobra`,
PersistentPreRun: func(cmd *cobra.Command, args []string) {
// Configuración inicial
},
}
func Execute() {
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
}
}
Comandos personalizados:
// cmd/server.go
var (
port string
host string
debug bool
)
var serverCmd = &cobra.Command{
Use: "server",
Short: "Iniciar el servidor",
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf("Iniciando servidor en %s:%s\n", host, port)
if debug {
fmt.Println("Modo debug activado")
}
// Iniciar servidor
},
}
func init() {
rootCmd.AddCommand(serverCmd)
serverCmd.Flags().StringVarP(&port, "port", "p", "8080", "Puerto del servidor")
serverCmd.Flags().StringVarP(&host, "host", "H", "localhost", "Host del servidor")
serverCmd.Flags().BoolVarP(&debug, "debug", "d", false, "Modo debug")
}
Comando con subcomandos:
// cmd/config.go
var configCmd = &cobra.Command{
Use: "config",
Short: "Gestionar configuración",
}
var configGetCmd = &cobra.Command{
Use: "get [key]",
Short: "Obtener valor de configuración",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
key := args[0]
value := getConfig(key)
fmt.Printf("%s=%s\n", key, value)
},
}
var configSetCmd = &cobra.Command{
Use: "set [key] [value]",
Short: "Establecer valor de configuración",
Args: cobra.ExactArgs(2),
Run: func(cmd *cobra.Command, args []string) {
setConfig(args[0], args[1])
fmt.Println("Configuración actualizada")
},
}
func init() {
rootCmd.AddCommand(configCmd)
configCmd.AddCommand(configGetCmd)
configCmd.AddCommand(configSetCmd)
}
Viper para configuración:
import "github.com/spf13/viper"
func initConfig() {
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
viper.AddConfigPath("$HOME/.mi-cli")
viper.AutomaticEnv()
if err := viper.ReadInConfig(); err != nil {
fmt.Println("Error leyendo config:", err)
}
}
// Uso
port := viper.GetInt("server.port")
debug := viper.GetBool("debug")
💡 Ejemplos famosos: kubectl, docker CLI, hugo, y github CLI están construidos con Cobra.