Разработка быстрых приложений в наши дни никогда не была проще с помощью всех инструментов, к которым у нас есть доступ. Go — это язык программирования, созданный одними из величайших инженеров-программистов нашего времени. Он помогает создавать все, что связано с серверной частью, от инструментов CLI до API и даже блокчейнов и таких инструментов, как Docker.

В этом уроке я расскажу, как создать простой инструмент CLI с помощью Go с помощью Cobra и как его можно использовать в самой известной операционной системе для разработки программного обеспечения — Linux.

Предварительные условия

Для выполнения этого руководства вам понадобятся:

  • Го — версия 1.20
  • Кобра CLI
  • Система Linux — я использую Ubuntu 22.04.

Монтаж

В этом разделе мы установим два инструмента, которые будем использовать: Go и Cobra CLI.

Перейти к установке

Чтобы скачать Go, вам сначала необходимо скачать файл tar.gz для вашей ОС с этой страницы: https://go.dev/dl/

После загрузки выполните приведенную ниже команду, чтобы удалить все версии заказа и установить эту версию:

rm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.4.linux-amd64.tar.gz

Как только это будет сделано, вам следует экспортировать PATH для двоичного файла Go. Вы можете сделать это, запустив приведенную ниже строку в своем терминале или добавив ее в конец файла ~/.bashrc:

export PATH=$PATH:/usr/local/go/bin

Теперь на вашем компьютере должен быть установлен Go, и вы сможете использовать его глобально. Чтобы убедиться, что он загружен, выполните следующую команду:

go version

Если в выводе отображается версия, которую вы пытались установить, это означает, что установка прошла успешно!

Установка CLI Cobra

Поскольку вы скачали Go, теперь вам будет легко установить Cobra CLI. Вы можете запустить команду ниже, чтобы установить двоичный файл:

go install github.com/spf13/cobra-cli@latest

После завершения вы можете протестировать установку, запустив:

cobra-cli

Если отображается описание приложения, это означает, что установка прошла успешно.

Настройка проекта

В этом разделе мы создаем основные файлы приложения.

Создание основного каталога и инициализация модулей Go

Мы создадим приложение «Цитаты», содержащее несколько цитат и идентификатор каждой из них. Инструмент сможет:

  • Перечислите все котировки, включая их идентификаторы.
  • Перечислите конкретную цитату, используя ее идентификатор

Сначала мы создадим каталог с именем quotes и получим к нему доступ:

mkdir quotes
cd quotes

Затем нам нужно инициализировать файл модулей Go, вы можете сделать это, выполнив команду ниже:

go mod init quotes

Это файл, содержащий зависимости инструмента, а также имеющуюся у вас версию Go. quotes в команде относится к названию инструмента или модуля.

Теперь вы должны увидеть файл с именем go.mod в своем каталоге.

Настройка инструмента Cobra CLI

Инструмент Cobra CLI позволяет легко приступить к созданию инструментов на основе CLI. Вы можете запустить следующую команду, чтобы создать необходимые файлы для начала использования инструмента:

cobra-cli init

Приведенная выше команда создаст несколько файлов, в том числе:

  • main.go — это основной файл, который позволит вам запустить и запустить инструмент. Туда даже добавили необходимую команду для запуска инструмента Cobra.
  • Каталог cmd — этот каталог содержит все команды, каждая из которых представляет собой отдельный файл. Вы должны увидеть там один файл с именем root.go. Это первая часть приложения. В нем описывается, как будет работать инструмент, и показано краткое и подробное описание инструмента.

Мы можем собрать и запустить инструмент, выполнив следующие команды:

go build .
./quotes

Первая команда собирает инструмент, а вторая запускает его. Вы должны увидеть подробное описание приложения, которое было в файле root.go.

Понимание командного кода Cobra

Если мы удалим все комментарии в файле, он должен выглядеть так:

package cmd

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

var rootCmd = &cobra.Command{
    Use:   "quotes",
    Short: "A brief description of your application",
    Long: `A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
}

func Execute() {
    err := rootCmd.Execute()
    if err != nil {
        os.Exit(1)
    }
}

func init() {
    rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

Первая часть файла включает имя пакета и данные импорта.

Вторая часть, начинающаяся с var rootCmd = &cobra.Command{, — это инициализация типа структуры в Go. Структура взята из пакета cobra и на данный момент включает в себя три вещи:

  • Use — описывает ключевое слово, которое будет использоваться в командной строке для запуска этого конкретного файла.
  • Short — краткое и краткое описание инструмента.
  • Long – более подробное описание инструмента.

Примечание: позже мы добавим и другие значения в другие файлы

Третья часть состоит из двух функций Execute и init. Execute просто запускает инструмент. init устанавливает все необходимые значения, а также принимает flags, как и флаг toggle, который мы видим в файле.

Создание команды Show

Мы начнем с создания команды show, которая будет основной частью инструмента. Это будет:

  • Перечислите все цитаты
  • Укажите конкретную цитату

Находясь в корневом каталоге инструмента, мы можем запустить следующую команду, чтобы создать файл show.go и команду:

cobra-cli add show

Как только это будет сделано, вы должны увидеть новый файл show.go в каталоге cmd.

Этот файл будет содержать новое значение внутри cobra.Command, которое является значением Run. Это функция, которая в основном запускается при запуске команды.

Если вам интересно, вы можете изменить описания root.go и show.go на что-то более подходящее. Но пока я пропущу эту часть.

Мы можем начать работу над реальной функциональностью прямо сейчас.

Добавление и отображение котировок

Мы будем писать весь код в файле show.go и внутри функции Run.

Мы можем начать с создания типа Struct, описывающего цитату:

type  Quote  struct {
    ID int
    Author string
    Text string
}

ID будет уникальным числовым значением, описывающим котировку. Это будет серия последовательных номеров, начиная с 1.

Затем мы можем создать массив котировок:

quotes  := []Quote{
    {
        ID: 1,
        Author: "Alan Kay",
        Text: "Simple things should be simple, complex things should be possible",
    },
    {
        ID: 2,
        Author: "Edsger W. Dijkstra",
        Text: "Simplicity is prerequisite for reliability.",
    },
    {
        ID: 3,
        Author: "Ralph Johnson",
        Text: "Before software can be reusable it first has to be usable.",
    },
}

В приведенном выше коде структура Quote используется для создания массива кавычек. Я выбрал свои любимые цитаты с этой страницы: https://hackernoon.com/40- Thought-provoking-software-engineering-quotes-xp2z3tdr

Поскольку у нас установлены котировки, теперь мы можем начать их печатать. Мы можем сделать это, добавив строки ниже:

for  _, quote  :=  range quotes {
    fmt.Printf("%d. %s - %s\n", quote.ID, quote.Text, quote.Author)
}

Цикл for, приведенный выше, в основном перебирает кавычки и печатает их определенным образом.

Теперь мы можем собрать и запустить инструмент, выполнив следующие команды:

go build .
./quotes show

После выполнения вышеуказанных команд вы должны увидеть следующий вывод:

1. Simple things should be simple, complex things should be possible - Alan Kay 
2. Simplicity is prerequisite for reliability. - Edsger W. Dijkstra 
3. Before software can be reusable it first has to be usable. - Ralph Johnson

Большой! Нам удалось создать нашу первую команду и запустить ее, используя ключевое слово, указанное в файле show.go под Use в структуре cobra.Command. Теперь мы можем расширить и добавить возможность отображения конкретной цитаты из списка.

Добавление флага и опции идентификатора

Теперь, когда у нас есть кавычки в указанной структуре, мы можем добавить флаг, позволяющий выбирать, какую кавычку отображать, на основе предоставленного идентификатора. Мы можем начать это делать, добавив флаг в конце функции init в файле show.go:

showCmd.Flags().Int("id", 0, "ID of the quote to show")

Линия состоит из трех частей:

  • showCmd — указывает команду, к которой мы добавим опцию, в нашем случае это команда showCmd.
  • .Flags() — добавляет флаг к команде showCmd.
  • .Int("id", 0, "ID of the quote to show") — добавляет детали флага, который мы хотим добавить. Он состоит из четырех частей:
  • .Int(... — это тип данных, которые мы хотим добавить. В нашем случае это целое число, следовательно, это Int.
  • "id" — это ключ или имя значения и способ его запуска в команде.
  • 0 — это значение по умолчанию для этого ключа. Таким образом, если при выполнении команды пользователь не указал никакого значения, это будет значение id.
  • "ID of the quote to show" - Это просто описание имеющейся у нас опции.

Мы можем начать реализацию его функциональности в команде Run.

Создайте новый файл прямо перед добавленным ранее циклом for и добавьте следующие команды:

...

id, _  := cmd.Flags().GetInt("id") // skipping error for simplicity

if id >  0 {
    var  printableQuote Quote
    for  _, quote  :=  range quotes {
        if quote.ID == id {
            printableQuote  = quote
            break
        }
    }

    if printableQuote.ID !=  0 {
        fmt.Printf("%d. %s - %s\n", printableQuote.ID, printableQuote.Text, printableQuote.Author)
    }
    return
}
...

Мы начинаем с получения идентификатора (он возвращает ошибку, но мы пока пропустим это).

id, _  := cmd.Flags().GetInt("id")

Мы получаем доступ к флагам команд и получаем Int с помощью ключа id, как это было указано ранее.

Затем мы проверяем, превышает ли значение id 0. Имейте в виду, что 0 было значением по умолчанию, то есть нам придется пропустить этот фрагмент кода, если id равно 0.

Пройдя оператор if, он найдет котировку, используя id. Как только он его найдет, он напечатает его в том же формате, который мы использовали ранее в цикле for. Если цитата с указанным id не найдена, ничего не происходит.

Мы можем запустить команду, сначала создав инструмент:

go build .

Затем выполните команду:

./quotes show --id 3

Мы должны увидеть, как цитата с идентификатором 3 выводится на экран:

user@ubuntu ~/quotes> ./quotes show --id 3 
3. Before software can be reusable it first has to be usable. - Ralph Johnson

Если мы попытаемся запустить его с id, которого нет в массиве quotes (например, 4), ничего не произойдет.

Заключение

Надеюсь, вам было легко создать инструмент CLI с помощью Go и Cobra. В настоящее время это мой любимый способ создания инструментов на основе CLI для любых целей. Сочетание возможностей Cobra со скоростью и простотой использования Go делает создание инструмента таким образом очень интересным, гарантируя при этом высокую скорость выполнения инструмента.

Вы можете найти документацию для инструмента Cobra по ссылке ниже: https://github.com/spf13/cobra

Спасибо, что прочитали этот урок. Надеюсь, вам понравилось.

Оригинально опубликовано на https://hazemhadi.com.