CLI фреймворки для Go (Golang): создаём профессиональные консольные приложения
Go (Golang) заслуженно считается одним из лучших языков для создания консольных утилит. Благодаря быстрой компиляции, встроенной поддержке многопоточности и удобной системе пакетов, на Go написаны такие легендарные инструменты, как Docker, Kubernetes, Hugo и Terraform. Однако для создания действительно удобного и гибкого CLI (Command Line Interface) часто требуется не только стандартная библиотека flag, но и специализированные фреймворки. В этой статье мы подробно разберём лучшие CLI фреймворки для Go, их возможности, преимущества и примеры использования.
Зачем нужен CLI фреймворк?
Стандартная библиотека flag отлично справляется с простыми задачами, но когда ваш проект разрастается, появляются потребности в:
- Поддержке вложенных команд (subcommands), как в
git commitилиdocker run. - Автоматической генерации справки и man-страниц.
- Автодополнении (bash/zsh/fish completion).
- Парсинге сложных флагов и аргументов.
- Интерактивном режиме работы (TUI).
Именно для этих задач и существуют CLI фреймворки.
1. Cobra — король CLI в Go
Cobra — это самый популярный фреймворк для создания CLI на Go. Он используется в Kubernetes, Hugo, GitHub CLI и многих других проектах. Cobra предоставляет мощный интерфейс для создания команд, флагов и аргументов.
Ключевые возможности:
- Простое создание вложенных команд.
- Автоматическая генерация справки и man-страниц.
- Поддержка автодополнения для bash, zsh, fish и PowerShell.
- Интеграция с Viper (менеджер конфигураций).
- Генерация каркаса проекта через
cobra-cli init.
Пример кода на Cobra:
package main
import (
"fmt"
"os"
"github.com/spf13/cobra"
)
func main() {
var rootCmd = &cobra.Command{
Use: "greet",
Short: "Приветственная утилита",
Long: "Простая утилита для приветствия пользователя",
Run: func(cmd *cobra.Command, args []string) {
name, _ := cmd.Flags().GetString("name")
if name == "" {
name = "мир"
}
fmt.Printf("Привет, %s!\n", name)
},
}
rootCmd.Flags().StringP("name", "n", "", "Имя пользователя")
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
Запустив эту программу с флагом --name "Вася", вы получите приветствие. Cobra автоматически добавит флаг --help и красивое форматирование вывода.
2. urfave/cli (ранее codegangsta/cli)
urfave/cli — второй по популярности фреймворк. Он отличается простым и интуитивным API, ориентированным на декларативное описание команд. Отлично подходит для небольших и средних проектов.
Преимущества:
- Минималистичный и понятный код.
- Встроенная поддержка флагов, аргументов и подкоманд.
- Автоматическая генерация справки.
- Поддержка действий до и после выполнения команды (Before/After hooks).
Пример кода на urfave/cli:
package main
import (
"fmt"
"log"
"os"
"github.com/urfave/cli/v2"
)
func main() {
app := &cli.App{
Name: "calculator",
Usage: "Простой калькулятор",
Commands: []*cli.Command{
{
Name: "add",
Aliases: []string{"a"},
Usage: "Сложение двух чисел",
Action: func(cCtx *cli.Context) error {
x := cCtx.Int("x")
y := cCtx.Int("y")
fmt.Printf("Результат: %d\n", x+y)
return nil
},
Flags: []cli.Flag{
&cli.IntFlag{Name: "x", Usage: "Первое число"},
&cli.IntFlag{Name: "y", Usage