Frameworks CLI pour Go : des utilitaires simples aux interfaces TUI
Go (Golang) est devenu le langage n°1 pour créer des utilitaires console et des outils DevOps. Grâce à une compilation rapide, une prise en charge intégrée de la concurrence et une distribution simple (un seul fichier binaire), Go est idéal pour la CLI. Cependant, écrire un analyseur d'arguments, une gestion des erreurs et un affichage coloré à partir de zéro est une tâche laborieuse. Les frameworks CLI viennent à la rescousse. Dans cet article, nous analyserons trois outils clés : Cobra, urfave/cli et Bubble Tea.
1. Cobra — la norme de l'industrie
Cobra (github.com/spf13/cobra) est le framework le plus populaire pour Go. Il est utilisé par Kubernetes, Hugo, Docker, GitHub CLI. Cobra fournit un puissant générateur de commandes, des sous-commandes imbriquées, l'autocomplétion pour bash/zsh/fish et une intégration avec Viper (gestion des configurations).
Installation
go get -u github.com/spf13/cobra/cobraExemple : application simple avec sous-commandes
package main
import ( "fmt" "github.com/spf13/cobra")
func main() { var rootCmd = &cobra.Command{ Use: "app", Short: "Exemple d'application avec Cobra", Run: func(cmd *cobra.Command, args []string) { fmt.Println("Gestionnaire racine exécuté") }, }
var helloCmd = &cobra.Command{ Use: "hello [name]", Short: "Saluer l'utilisateur", Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { fmt.Printf("Bonjour, %s!", args[0]) }, }
rootCmd.AddCommand(helloCmd) rootCmd.Execute()}Fonctionnalités clés :
- Génération automatique de l'aide (--help)
- Prise en charge des flags (persistants, locaux)
- Validation des arguments
- Génération de scripts d'autocomplétion
- Intégration avec Viper pour la configuration
2. Urfave/cli — simplicité et flexibilité
Urfave/cli (github.com/urfave/cli/v2) est une alternative légère à Cobra. Le framework est déclaratif : vous décrivez les commandes, les flags et les actions dans des structures. Idéal pour les utilitaires petits et moyens.
Installation
go get github.com/urfave/cli/v2Exemple : utilitaire de gestion de fichiers
package main
import ( "fmt" "log" "os" "github.com/urfave/cli/v2")
func main() { app := &cli.App{ Name: "fileutil", Usage: "utilitaire de gestion de fichiers", Commands: []*cli.Command{ { Name: "read", Aliases: []string{"r"}, Usage: "lire un fichier", Action: func(cCtx *cli.Context) error { if cCtx.NArg() == 0 { return fmt.Errorf("spécifiez le nom du fichier") } data, _ := os.ReadFile(cCtx.Args().First()) fmt.Println(string(data)) return nil }, }, { Name: "write", Aliases: []string{"w"}, Usage: "écrire une chaîne dans un fichier", Flags: []cli.Flag{ &cli.StringFlag{ Name: "content", Aliases: []string{"c"}, Usage: "contenu à écrire", }, }, Action: func(cCtx *cli.Context) error { content := cCtx.String("content") if content == "" { return fmt.Errorf("spécifiez --content") } return os.WriteFile(cCtx.Args().First(), []byte(content), 0644) }, }, }, }
if err := app.R Aussi dans la bibliothèque
Bibliothèque standard Swift : aperçu complet pour iOS/macOS
gRPC en Rust : bibliothèques Tonic et Grpc-rs avec exemples
Travail avec les dates en Kotlin : bibliothèques et outils (Kotlinx-datetime, Joda-Time, java.time)
gRPC pour JavaScript (Node.js) : bibliothèques, configuration et exemples de code