CLI фреймворки для Go: Cobra, Urfave/cli и Bubble Tea

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

CLI фреймворки для Go: от простых утилит до TUI-интерфейсов

Go (Golang) стал языком №1 для создания консольных утилит и инструментов DevOps. Благодаря быстрой компиляции, встроенной поддержке конкурентности и простой дистрибуции (один бинарный файл), Go идеально подходит для CLI. Однако написание парсера аргументов, обработки ошибок и цветного вывода с нуля — трудоёмкая задача. На помощь приходят CLI фреймворки. В этой статье мы разберём три ключевых инструмента: Cobra, urfave/cli и Bubble Tea.

1. Cobra — стандарт индустрии

Cobra (github.com/spf13/cobra) — самый популярный фреймворк для Go. Его используют Kubernetes, Hugo, Docker, GitHub CLI. Cobra предоставляет мощный генератор команд, вложенные подкоманды, автодополнение для bash/zsh/fish и интеграцию с Viper (управление конфигами).

Установка

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

Пример: простое приложение с подкомандами

package main

import (
    "fmt"
    "github.com/spf13/cobra"
)

func main() {
    var rootCmd = &cobra.Command{
        Use:   "app",
        Short: "Пример приложения на Cobra",
        Run: func(cmd *cobra.Command, args []string) {
            fmt.Println("Запущен корневой обработчик")
        },
    }

    var helloCmd = &cobra.Command{
        Use:   "hello [name]",
        Short: "Приветствие пользователя",
        Args:  cobra.MinimumNArgs(1),
        Run: func(cmd *cobra.Command, args []string) {
            fmt.Printf("Привет, %s!\n", args[0])
        },
    }

    rootCmd.AddCommand(helloCmd)
    rootCmd.Execute()
}

Ключевые возможности:

  • Автоматическая генерация справки (--help)
  • Поддержка флагов (персистентных, локальных)
  • Валидация аргументов
  • Генерация скриптов автодополнения
  • Интеграция с Viper для конфигурации

2. Urfave/cli — простота и гибкость

Urfave/cli (github.com/urfave/cli/v2) — лёгкая альтернатива Cobra. Фреймворк декларативный: вы описываете команды, флаги и действия в структурах. Идеален для небольших и средних утилит.

Установка

go get github.com/urfave/cli/v2

Пример: утилита для работы с файлами

package main

import (
    "fmt"
    "log"
    "os"
    "github.com/urfave/cli/v2"
)

func main() {
    app := &cli.App{
        Name:  "fileutil",
        Usage: "утилита для работы с файлами",
        Commands: []*cli.Command{
            {
                Name:    "read",
                Aliases: []string{"r"},
                Usage:   "прочитать файл",
                Action: func(cCtx *cli.Context) error {
                    if cCtx.NArg() == 0 {
                        return fmt.Errorf("укажите имя файла")
                    }
                    data, _ := os.ReadFile(cCtx.Args().First())
                    fmt.Println(string(data))
                    return nil
                },
            },
            {
                Name:    "write",
                Aliases: []string{"w"},
                Usage:   "записать строку в файл",
                Flags: []cli.Flag{
                    &cli.StringFlag{
                        Name:    "content",
                        Aliases: []string{"c"},
                        Usage:   "содержимое для записи",
                    },
                },
                Action: func(cCtx *cli.Context) error {
                    content := cCtx.String("content")
                    if content == "" {
                        return fmt.Errorf("укажите --content")
                    }
                    return os.WriteFile(cCtx.Args().First(), []byte(content), 0644)
                },
            },
        },
    }

    if err := app.Run(os.Args); err != nil {
        log.Fatal(err)
    }
}

Отличия от Cobra:

  • Меньше кода для простых приложений
  • Встроенная поддержка флагов окружения (EnvVars)
  • Удобная работа с аргументами через cCtx.Args()
  • Более гибкая система действий (Action)

3. Bubble Tea — TUI (терминальный интерфейс)

Bubble Tea (github.com/charmbracelet/bubbletea) — это не просто CLI-фреймворк, а полноценная библиотека для создания TUI (Terminal User Interface). Основана на модели Elm (состояние, сообщение, обновление). Поз

Рекомендаций