Este build de referência é myctl, uma ferramenta de operador multi-comando: migrações de banco de dados, status de cluster, alvos controlados por configuração, uma UI de progresso Bubble Tea e um pipeline goreleaser que envia arquivos compactados assinados para Linux, macOS e Windows.
Use-o quando sua equipe precisar de mais do que um único main com flags, mas menos do que um produto de plataforma completo.
CLIs de produção em Go compilam para um único binário, iniciam rapidamente e se comportam de forma previsível em scripts.
Este build usa cobra para árvores de comandos, viper para configuração em camadas, slog para logs legíveis por máquina quando --json é definido, e Bubble Tea para fluxos interativos que ainda respeitam o cancelamento Ctrl+C.
Comandos separam operações de leitura (seguras para CI) de operações de escrita (prompts de confirmação, a menos que --yes).
A automação de release embuti a versão, commit e data de build via -ldflags para suporte.
myctl --config ~/.config/myctl/config.yaml cluster status --context prodmyctl migrate up --dsn "$DATABASE_URL" --yesmyctl watch jobs --interval 2smyctl version --output json
Quando usar este layout:
Operadores executam a ferramenta em CI, sessões SSH e laptops usando os mesmos comandos.
Subcomandos mapeiam para fluxos de trabalho de domínio (migrate, deploy, diagnose), não pacotes Go.
Você precisa de precedência de arquivo de configuração + env + flag sem código de parsing customizado.
Tarefas longas se beneficiam de uma TUI, enquanto tarefas curtas permanecem em stdout simples.
Invocação: shell chama subcomando → cobra parseia flags → viper mescla arquivo/env → comando RunE executa com context.Context quando IO é de longa duração.
Saída: tabelas humanas para stdout; diagnósticos para stderr; --json alterna o manipulador slog no stderr para agentes.
Erros: retorna error de RunE; mapeia falhas conhecidas para códigos de saída 2 (uso) e 3 (sucesso parcial) em main, se necessário.
Release: GoReleaser constrói arquivos compactados de matriz, checksums e assinaturas cosign opcionais.
Estado global do Viper em testes - testes paralelos competem pela configuração. Correção: resete o viper em t.Cleanup ou injete a struct de configuração em vez de globais em novos comandos.
Sem contexto em chamadas de rede - Ctrl+C não para clientes de API pendentes. Correção: use cmd.Context() em cada RunE.
Comandos de escrita sem salvaguardas - CI destrói a produção. Correção: exija --yes ou confirmação interativa quando stdin não for um TTY.
Formatos de saída inconsistentes - scripts quebram com desvio de colunas. Correção:--output json estável em comandos de leitura; use semver no esquema.
goreleaser sem testes de fumaça compilados cruzados - builds arm64 quebrados são enviados silenciosamente. Correção:go test mais myctl version em cada arquivo compactado construído em CI.
Logging para stdout - polui fluxos de trabalho canalizados. Correção: logs para stderr; dados para stdout.
Versões da Stack: Esta página foi escrita para Go 1.26.x (padrão GC Green Tea, go fix modernizers - verifique o patch na build), chi (última - verifique na build), gin (última - verifique na build), echo (última - verifique na build), google.golang.org/grpc (última - verifique na build), sigs.k8s.io/controller-runtime (última - verifique na build), kubebuilder (última - verifique na build), tinygo (última - verifique os alvos de placa na build), wazero (última - verifique na build) e golangci-lint (última - verifique o conjunto de linters na build).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026