kingpin & UX avanzada de CLI
kingpin (github.com/alecthomas/kingpin/v2) modela las CLIs como una cadena fluida: aplicación, comandos anidados, flags tipados, argumentos posicionales y enums validados antes de que se ejecute tu Action.
Busca en todas las páginas de la documentación
kingpin (github.com/alecthomas/kingpin/v2) modela las CLIs como una cadena fluida: aplicación, comandos anidados, flags tipados, argumentos posicionales y enums validados antes de que se ejecute tu Action.
Influyó en frameworks posteriores y sigue siendo útil para leer herramientas heredadas.
El repositorio original está archivado; las nuevas CLIs desde cero deberían estandarizarse en cobra o urfave/cli, pero los patrones de UX de kingpin (parseo tipado, argumentos requeridos, restricciones de enum) siguen aplicándose en todas partes.
kingpin separa el parseo de la ejecución: primero declaras la gramática, luego adjuntas callbacks Action que reciben valores completamente validados.
Los enums restringen cadenas a un conjunto fijo; los contadores y las URLs se parsean en tipos nativos sin llamadas manuales a strconv.
La UX avanzada significa fallar rápido con mensajes precisos antes de que se ejecute cualquier E/S de red o archivo.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
app := kingpin.New("deploy", "CLI de despliegue")
env := app.Arg("env", "entorno de destino").Required().Enum("staging", "prod")
timeout := app.Flag("timeout", "esperar").Default("30s").Duration()
kingpin.MustParse(app.Parse(os.Args[1:]))
fmt.Println(*env, *timeout)Cuándo usar esto:
Prefiere cobra para trabajo nuevo a menos que estés extendiendo código ya construido sobre kingpin.
package main
import (
"fmt"
"os"
"time"
"github.com/alecthomas/kingpin/v2"
)
var (
app = kingpin.New("ship", "herramienta de envío")
verbose = app.Flag("verbose", "salida detallada").Short('v').Bool()
mode = app.Flag("mode", "modo de ejecución").Enum("dry", "apply")
timeout = app.Flag("timeout", "tiempo de espera de la operación").Default("10s").Duration()
)
func main() {
cmd := kingpin.MustParse(app.Parse(os.Args[1:]))
switch cmd {
case shipRun.FullCommand():
run(*verbose, *mode, *timeout)
}
}
var shipRun = app.Command("run", "ejecutar envío")
func run(verbose bool, mode string, timeout time.Duration) {
fmt.Printf("verbose=%v mode=%s timeout=%s\n", verbose, mode, timeout)
}Lo que esto demuestra:
Enum rechaza valores fuera de dry y apply en tiempo de parseo.Duration parsean la sintaxis de duración de Go sin métodos Set personalizados.app.Command; FullCommand() identifica cuál coincidió.kingpin.MustParse sale en errores de gramática antes de que run se ejecute.Parse consume os.Args[1:], aplica valores predeterminados, realiza la coerción de tipos y devuelve la cadena del comando seleccionado..Required(); los opcionales posicionales usan .String() sin Required.| API | Propósito |
|---|---|
.Enum("a", "b") | Restringir flag o argumento de cadena |
.Required() | Fallar el parseo si falta |
.Short('v') | Alias de una sola letra |
.Default("10s") | Valor predeterminado pre-parseo para flags tipados |
.ExistingFile() | La ruta debe existir en disco |
.URL() | Parsear y validar la forma de la URL |
| kingpin | equivalente en cobra |
|---|---|
app.Flag(...).Bool() | cmd.Flags().BoolVar |
app.Arg(...).Required() | Args: cobra.ExactArgs(1) + RunE |
.Enum(...) | validación personalizada en PreRunE o MarkFlagRequired + verificación de conjunto permitido |
app.Command("run", ...) | &cobra.Command{Use: "run"} |
cmd, no en bibliotecas.MustParse, la lógica de negocio debe vivir en funciones simples para que sean testeables.os/exec.app globales hacen que las pruebas dependan del orden. Solución: envuelve el parseo + acción en funciones que acepten []string.os.Args. Solución: un framework por binario.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| cobra | Nuevas herramientas, ecosistema k8s | Solo mantienes kingpin heredado |
| urfave/cli v2 | Estructura de app basada en callbacks | Necesitas scaffolds de kubebuilder |
| kong | Las etiquetas de struct controlan la CLI | El equipo ya conoce kingpin |
| stdlib flag | Dos flags en total | La validación de enums es manual |
Prefiere cobra o urfave/cli para código nuevo.
kingpin es apropiado cuando extiendes un binario existente ya escrito con él.
Los enums de kingpin se declaran en el momento de la construcción de la gramática y se validan antes de que se ejecuten las acciones.
flag.Value valida por flag en la biblioteca estándar con más código repetitivo.
El soporte es limitado en comparación con cobra.
Planifica scripts de completado manuales o migra si el completado con tabulación es crítico.
Llama a app.Parse([]string{"run", "--mode=dry"}) sin tocar os.Args, o prueba la función run después del parseo con valores inyectados.
Valida en la Action después del parseo o migra a cobra MarkFlagsMutuallyExclusive (características de pflag en Go 1.22+).
Documenta los conflictos claramente en el texto de ayuda.
Cada Command obtiene su propia sección de ayuda generada a partir de las definiciones fluidas.
Mantén las cadenas Help orientadas a la acción ("ejecutar envío", no "comando de ejecución").
Sí para CLIs de Go; los usuarios de PowerShell todavía esperan flags largos en los scripts.
Documenta las formas portables en los ejemplos de README.
.ExistingFile() y .ExistingDir() hacen stat de las rutas durante el parseo.
Falla rápido antes de subidas lentas cuando las rutas son incorrectas.
No.
Mantén la gramática de la CLI en los paquetes main o cmd para que los consumidores de la biblioteca no se vean obligados a usar un framework de CLI.
Validar temprano, flags tipados, enums explícitos y argumentos requeridos se mapean directamente a PreRunE de cobra y validadores de flags.
Trata el código de kingpin como una especificación al reescribir comandos.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado GC Green Tea, modernizadores de
go fix- verificar parche en la compilación), chi (última - verificar en la compilación), gin (última - verificar en la compilación), echo (última - verificar en la compilación), google.golang.org/grpc (última - verificar en la compilación), sigs.k8s.io/controller-runtime (última - verificar en la compilación), kubebuilder (última - verificar en la compilación), tinygo (última - verificar objetivos de placa en la compilación), wazero (última - verificar en la compilación), y golangci-lint (última - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 19 jul 2026