CLI frameworks para Go (Golang): guia detalhado
Go (Golang) é uma linguagem ideal para criar ferramentas de linha de comando (CLI). Graças à compilação rápida, suporte embutido para concorrência e distribuição simples como um único arquivo binário, Go se tornou o padrão de facto para o desenvolvimento de aplicações CLI. No entanto, para criar interfaces de linha de comando complexas, convenientes e escaláveis, a biblioteca padrão flag muitas vezes não é suficiente. É aqui que entram os frameworks especializados. Neste artigo, examinaremos detalhadamente os três frameworks CLI mais populares para Go: Cobra, urfave/cli e Kong, compararemos seus recursos e mostraremos exemplos de uso.
Por que usar um framework CLI?
Desenvolver uma aplicação CLI do zero pode rapidamente se transformar em caos, especialmente quando se trata de:
- Suporte para comandos aninhados (subcommands) e flags.
- Geração automática de ajuda (
--help). - Tratamento de erros e validação de argumentos.
- Autocompletar (bash/zsh completion).
Os frameworks resolvem esses problemas fornecendo uma arquitetura pronta e um conjunto de ferramentas.
1. Cobra — o rei das CLI em Go
Cobra é o framework mais popular para criar CLI em Go. Ele é usado em gigantes como Kubernetes, Hugo, Docker e GitHub CLI. Cobra é construído sobre o conceito de comandos, argumentos e flags.
Principais recursos do Cobra:
- Comandos e subcomandos: Qualquer ação é um comando (
app serve,app init). - Flags: Globais (
--verbose) e locais para o comando. - Ajuda automática: Gerada a partir das descrições dos comandos.
- Autocompletar: Suporte embutido para bash, zsh, fish e PowerShell.
- Gerador de código: A utilidade
cobra-clicria o esqueleto do projeto.
Exemplo de código com Cobra:
package main
import ( "fmt" "github.com/spf13/cobra")
func main() { var rootCmd = &cobra.Command{ Use: "greet", Short: "Greet is a simple CLI tool", Long: "A simple CLI tool to greet people.", Run: func(cmd *cobra.Command, args []string) { fmt.Println("Hello! Use 'greet hello --name' to greet someone.") }, }
var name string var helloCmd = &cobra.Command{ Use: "hello", Short: "Greet a person", Run: func(cmd *cobra.Command, args []string) { fmt.Printf("Hello, %s!", name) }, }
helloCmd.Flags().StringVarP(&name, "name", "n", "World", "Name to greet") rootCmd.AddCommand(helloCmd) rootCmd.Execute()}Execução: go run main.go hello --name=PythonLib exibirá Hello, PythonLib!.
2. urfave/cli — simplicidade e minimalismo
Anteriormente conhecido como codegangsta/cli, este framework é famoso por sua simplicidade e API elegante. É ideal para projetos pequenos e médios onde não é necessária toda a potência do Cobra.
Características principais do urfave/cli:
- Estilo declarativo: A aplicação é descrita como uma estrutura de dados.
- Geração automática de ajuda: Bonita e legível.
- Suporte a ações: Cada comando tem sua própria função de tratamento.
- Tipos de flags embutidos: Strings, números, valores booleanos, duração e até arquivos.
Exemplo de código com urfave/cli:
package main
import ( "fmt" "log" "os"
"github.com/urfave/cli/v2")
func main() { app := &cli.App{ Name: "calc", Usage: "A simple calculator", Comman