Frameworks CLI para Go: de utilitários simples a interfaces TUI
Go (Golang) se tornou a linguagem nº 1 para criar utilitários de console e ferramentas DevOps. Graças à compilação rápida, suporte embutido para concorrência e distribuição simples (um único arquivo binário), Go é ideal para CLI. No entanto, escrever um parser de argumentos, tratamento de erros e saída colorida do zero é uma tarefa trabalhosa. É aqui que os frameworks CLI ajudam. Neste artigo, vamos analisar três ferramentas principais: Cobra, urfave/cli e Bubble Tea.
1. Cobra — o padrão da indústria
Cobra (github.com/spf13/cobra) é o framework mais popular para Go. É usado por Kubernetes, Hugo, Docker, GitHub CLI. O Cobra fornece um poderoso gerador de comandos, subcomandos aninhados, autocompletar para bash/zsh/fish e integração com Viper (gerenciamento de configurações).
Instalação
go get -u github.com/spf13/cobra/cobraExemplo: aplicativo simples com subcomandos
package main
import ( "fmt" "github.com/spf13/cobra")
func main() { var rootCmd = &cobra.Command{ Use: "app", Short: "Exemplo de aplicativo no Cobra", Run: func(cmd *cobra.Command, args []string) { fmt.Println("Manipulador raiz executado") }, }
var helloCmd = &cobra.Command{ Use: "hello [name]", Short: "Saudação ao usuário", Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { fmt.Printf("Olá, %s!", args[0]) }, }
rootCmd.AddCommand(helloCmd) rootCmd.Execute()}Principais recursos:
- Geração automática de ajuda (--help)
- Suporte a flags (persistentes, locais)
- Validação de argumentos
- Geração de scripts de autocompletar
- Integração com Viper para configuração
2. Urfave/cli — simplicidade e flexibilidade
Urfave/cli (github.com/urfave/cli/v2) é uma alternativa leve ao Cobra. O framework é declarativo: você descreve comandos, flags e ações em estruturas. Ideal para utilitários pequenos e médios.
Instalação
go get github.com/urfave/cli/v2Exemplo: utilitário para trabalhar com arquivos
package main
import ( "fmt" "log" "os" "github.com/urfave/cli/v2")
func main() { app := &cli.App{ Name: "fileutil", Usage: "utilitário para trabalhar com arquivos", Commands: []*cli.Command{ { Name: "read", Aliases: []string{"r"}, Usage: "ler arquivo", Action: func(cCtx *cli.Context) error { if cCtx.NArg() == 0 { return fmt.Errorf("informe o nome do arquivo") } data, _ := os.ReadFile(cCtx.Args().First()) fmt.Println(string(data)) return nil }, }, { Name: "write", Aliases: []string{"w"}, Usage: "escrever string no arquivo", Flags: []cli.Flag{ &cli.StringFlag{ Name: "content", Aliases: []string{"c"}, Usage: "conteúdo para escrever", }, }, Action: func(cCtx *cli.Context) error { content := cCtx.String("content") if content == "" { return fmt.Errorf("informe --content") } return os.WriteFile(cCtx.Args().First(), []byte(content), 0644) }, }, }, }
if err := app.R Também na biblioteca
GraphQL para Kotlin: bibliotecas poderosas para criar APIs
Processamento de Imagens em Java: Bibliotecas e Exemplos de Código
Tokens JWT em JavaScript (Node.js): guia completo
Container de Injeção de Dependência para C# (.NET) — guia completo
Geração de relatórios PDF em Go (Golang): bibliotecas e exemplos