Как создать интерфейс командной строки в Golang

интерфейс командной строки в Golang

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

https://github.com/ufukguler/spotify-go-cli

Итак, начнём

Сначала создаём новый проект:

$ mkdir my-cli && cd my-cli
$ go mod init my-cli

Затем нам нужна библиотека под названием Cobra, которая поможет нам создать приложение CLI. Cobra – это библиотека, предоставляющая простой интерфейс для создания мощных современных интерфейсов CLI, аналогичных инструментам git & go.

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

После запуска проекта, добавим команду root:

var rootCmd = &cobra.Command{
      Use: "spotify-go-client",
      Run: func(cmd *cobra.Command, args []string) {
          fmt.Println("Hello CLI")
      },
   }

И добавим это в main.go:

func main() {
   if err := rootCmd.Execute(); err != nil {
      fmt.Println(err.Error())
   }
}

Мы создали нашу базовую структуру. Когда запустим проект, воспользуемся методом Execute в rootCmd, который лишь выдаст “Hello, CLI” в командной строке.

$ go run main.go
Hello CLI

Наша структура папок будет выглядеть следующим образом:

.
├── cmd
│   ├── root.go
│   ├── version.go
│   └── ...
├── go.mod
├── go.sum
└── main.go

Итак, это было легко, но как мы можем добавить больше команд? Чтобы иметь возможность добавлять больше команд, можно создать больше cobra.Command{} и добавить эту команду в ваш rootCmd.

Создаём файл с именем version.go и добавим в него эти команды:

var versionCmd = &cobra.Command{
   Use:     "version",
   Short:   "Get CLI version",
   Example: "spotify-go-client version",
   Aliases: []string{"v"},
   Run: func(cmd *cobra.Command, args []string) {
      fmt.Println("1.0.0")
   },
}

func init() {
   rootCmd.AddCommand(versionCmd)
}

Как получить пользовательский ввод с помощью команды?

При выполнении команды мы можем получить аргументы, переданные вместе с командой. Вы можете использовать аргументы в переменной args[] по своему усмотрению.

Это можно сделать так:

var repeatCmd = &cobra.Command{
   Use: "repeat",
   Run: func(cmd *cobra.Command, args []string) {
      input := strings.Join(args, " ")
      fmt.Printf("User input is: %v", input)
   },
}

Запускаем:

$ .\my-cli repeat Hi there! 
User input is: Hi there!

Ответить