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 (состояние, сообщение, обновление). Поз
Также в библиотеке
OAuth клиент для C# (.NET): реализация авторизации через сторонние сервисы
Парсинг HTML на Java: Jsoup, HtmlUnit и другие инструменты
Kotest для Kotlin: полное руководство с примерами
Конфигурация приложений Rust: библиотека `config` для гибкой настройки