Développement d'un outil de ligne de commande en Go / Golang

Vos outils en lignes de commande préféres tels que docker, kubernetes... sont dévéloppés avec ce module Go. Pourquoi pas le votre ?

Développement d'un outil de ligne de commande en Go / Golang

Prérequis : vous devez avoir au moins Go v1.13 (avant je n'ai pas testé).

Commencez par installer cobra:

go get -u github.com/spf13/cobra/cobra

Créez votre répertoire de travail (en dehors du Gopath)

$ cd maCli
$ go mod init maCli
$ git init
$ cobra init --pkg-name maCli

Pour utiliser votre programme, vous allez l'appeler, puis y ajouter une commande et enfin des arguments.

Ajoutez une nouvelle commande :

$ cobra add maCommande

Votre projet contient alors un main.go avec juste un point d'entrée qui va executer vos commandes. Vos commandes sont dans le répertoire "cmd". Vous avez "root.go" qui contient la commande par defaut et l'appel à votre programme sans commande. Vous pouvez y personnaliser votre message principal.

Dans chaque commande, vous retrouvez dans la fonction "init()" la gestion de vos arguments, avec 2 types : les persistens qui sont disponibles dans la commande en cours et les sous-commandes et la locale uniquement pour la commande en cours.

// Here you will define your flags and configuration settings.
// Cobra supports persistent flags, which, if defined here,
// will be global for your application.

rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.maCli.yaml)")

Par exemple, dans "maCommande.go" vous pouvez définir dans la fonction init()

func init() {
	rootCmd.AddCommand(maCommandeCmd)

	// Here you will define your flags and configuration settings.

	// Cobra supports Persistent Flags which will work for this command
	// and all subcommands, e.g.:
	foo = maCommandeCmd.PersistentFlags().String("foo", "", "A help for foo")
}

et dans la commande :

Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("maCommande called")
		if foo!=nil {
			fmt.Printf("with foo value : %s\n", *foo)
		}
	},

Si vous souhaitez voir certains projets qui utilisent cela: