Frameworks CLI para Go (Golang): criando aplicações de console profissionais
Go (Golang) é merecidamente considerada uma das melhores linguagens para criar utilitários de console. Graças à compilação rápida, suporte nativo a multithreading e um sistema de pacotes conveniente, ferramentas lendárias como Docker, Kubernetes, Hugo e Terraform foram escritas em Go. No entanto, para criar uma CLI (Interface de Linha de Comando) verdadeiramente conveniente e flexível, muitas vezes é necessário não apenas a biblioteca padrão flag, mas também frameworks especializados. Neste artigo, analisaremos detalhadamente os melhores frameworks CLI para Go, seus recursos, vantagens e exemplos de uso.
Por que preciso de um framework CLI?
A biblioteca padrão flag lida bem com tarefas simples, mas quando seu projeto cresce, surgem necessidades de:
- Suporte a comandos aninhados (subcomandos), como em
git commitoudocker run. - Geração automática de ajuda e páginas man.
- Autocompletar (bash/zsh/fish completion).
- Análise de flags e argumentos complexos.
- Modo de operação interativo (TUI).
É para essas tarefas que existem os frameworks CLI.
1. Cobra — o rei das CLIs em Go
Cobra é o framework mais popular para criar CLIs em Go. É usado em Kubernetes, Hugo, GitHub CLI e muitos outros projetos. O Cobra fornece uma interface poderosa para criar comandos, flags e argumentos.
Principais recursos:
- Criação simples de comandos aninhados.
- Geração automática de ajuda e páginas man.
- Suporte a autocompletar para bash, zsh, fish e PowerShell.
- Integração com Viper (gerenciador de configuração).
- Geração de esqueleto do projeto através de
cobra-cli init.
Exemplo de código com Cobra:
package main
import ( "fmt" "os"
"github.com/spf13/cobra")
func main() { var rootCmd = &cobra.Command{ Use: "greet", Short: "Utilitário de saudação", Long: "Um utilitário simples para saudar o usuário", Run: func(cmd *cobra.Command, args []string) { name, _ := cmd.Flags().GetString("name") if name == "" { name = "mundo" } fmt.Printf("Olá, %s!", name) }, }
rootCmd.Flags().StringP("name", "n", "", "Nome do usuário")
if err := rootCmd.Execute(); err != nil { fmt.Println(err) os.Exit(1) }}Ao executar este programa com a flag --name "João", você receberá uma saudação. O Cobra adiciona automaticamente a flag --help e uma formatação de saída elegante.
2. urfave/cli (anteriormente codegangsta/cli)
urfave/cli é o segundo framework mais popular. Ele se destaca por sua API simples e intuitiva, focada na descrição declarativa de comandos. É ideal para projetos pequenos e médios.
Vantagens:
- Código minimalista e compreensível.
- Suporte nativo a flags, argumentos e subcomandos.
- Geração automática de ajuda.
- Suporte a ações antes e depois da execução do comando (hooks Before/After).
Exemplo de código com urfave/cli:
package main
import ( "fmt" "log" "os"
"github.com/urfave/cli/v2")
func main() { app := &cli.App{ Name: "calculator", Usage: "Calculadora simples", Commands: []*cli.Command{ { Name: "add", Aliases: []string{"a"}, Usage: "Soma de dois números",