CLI фреймворки для Go (Golang): полный обзор инструментов для создания консольных приложений

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

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

Начать курс

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                    

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