Este build de referencia es myctl, una herramienta de operador multi-comando: migraciones de base de datos, estado del clúster, objetivos controlados por configuración, una UI de progreso con Bubble Tea y un pipeline de goreleaser que distribuye archivos firmados para Linux, macOS y Windows.
Úsalo cuando tu equipo necesite más que un único main con flags, pero menos que un producto de plataforma completo.
Las CLIs de producción en Go compilan en un solo binario, inician rápido y se comportan predeciblemente en scripts.
Este build usa cobra para árboles de comandos, viper para configuración en capas, slog para logs legibles por máquina cuando se establece --json, y Bubble Tea para flujos interactivos que aún respetan la cancelación con Ctrl+C.
Los comandos separan las operaciones de lectura (seguras para CI) de las operaciones de escritura (prompts de confirmación a menos que se use --yes).
La automatización de lanzamientos incrusta la versión, el commit y la fecha de build a través de -ldflags para la capacidad de soporte.
myctl --config ~/.config/myctl/config.yaml cluster status --context prodmyctl migrate up --dsn "$DATABASE_URL" --yesmyctl watch jobs --interval 2smyctl version --output json
Cuándo usar este diseño:
Los operadores ejecutan la herramienta en CI, sesiones SSH y laptops contra los mismos comandos.
Los subcomandos se mapean a flujos de trabajo de dominio (migrate, deploy, diagnose), no a paquetes de Go.
Necesitas precedencia de archivo de configuración + env + flag sin código de análisis personalizado.
Las tareas largas se benefician de una TUI mientras que las tareas cortas permanecen en stdout plano.
Invocación: el shell llama al subcomando → cobra analiza los flags → viper fusiona archivo/entorno → la RunE del comando se ejecuta con context.Context cuando la E/S es de larga duración.
Salida: tablas humanas a stdout; diagnósticos a stderr; --json cambia el manejador de slog en stderr para agentes.
Errores: devuelve error desde RunE; mapea fallos conocidos a códigos de salida 2 (uso) y 3 (éxito parcial) en main si es necesario.
Lanzamiento: GoReleaser construye archivos de matriz, checksums y firmas cosign opcionales.
Estado global de Viper en pruebas - las pruebas paralelas compiten por la configuración. Solución: reinicia viper en t.Cleanup o inyecta la estructura de configuración en lugar de globales en nuevos comandos.
Sin contexto en llamadas de red - Ctrl+C no detiene clientes de API colgados. Solución: usa cmd.Context() en cada RunE.
Comandos de escritura sin salvaguardas - la CI destruye la producción. Solución: requiere --yes o confirmación interactiva cuando stdin no es un TTY.
Formatos de salida inconsistentes - los scripts se rompen por cambios de columna. Solución:--output json estable en comandos de lectura; versiona el esquema semánticamente.
goreleaser sin pruebas de humo compiladas cruzadamente - se envían compilaciones de arm64 rotas silenciosamente. Solución:go test más myctl version en cada archivo compilado en CI.
Registrar en stdout - contamina los flujos de trabajo canalizados. Solución: logs a stderr; datos a stdout.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado GC de Green Tea, go fix modernizers - verificar parche en el build), chi (última - verificar en el build), gin (última - verificar en el build), echo (última - verificar en el build), google.golang.org/grpc (última - verificar en el build), sigs.k8s.io/controller-runtime (última - verificar en el build), kubebuilder (última - verificar en el build), tinygo (última - verificar objetivos de placa en el build), wazero (última - verificar en el build), y golangci-lint (última - verificar conjunto de linters en el build).
Revisado por Chris St. John·Última actualización: 16 jul 2026