Как создать интерфейс командной строки в Golang
интерфейс командной строки в Golang
Некоторым разработчикам нравится читать код и извлекать из него смысл. Если вы один из них, можете взглянуть на мой репозиторий в GitHub:
Итак, начнём
Сначала создаём новый проект:
$ 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!