Добавить Автора
Блог:В следующий раз после. can /blog/go wave…
смотрел недавноIstio(ОдинService Mesh
Framework) Связанные вещи и нашли новую вещь при рассмотрении своего исходного кодаCobra
, я обнаружил, что это хорошая вещь, и ее можно использовать во многих местах, например:Docker
,Kubernetes
Подождите, пока он появится. Чтобы лучше понять эти платформы с открытым исходным кодом (например,Istio
,Kubernetes
д.), необходимоCobra
Сделайте подробное понимание, будет много мест, где это может быть использовано в будущем. сегодняCobra
Чтобы сделать целое введение, дайте нам знать об этом, возможно, оно будет использоваться в вашем проекте в вашем проекте.
1. Знакомство с Коброй
1.1 Обзор кобры
Cobra
— это пакет Golang, предоставляющий простой интерфейс для создания программ командной строки. в то же время,Cobra
Это также приложение, используемое для создания фреймворков приложений для разработкиCobra
основанные приложения.
1.2 Основные функции
Основные функции Cobra следующие:
- Простые режимы подкомандной строки, такие как
app server
,app fetch
и т.п. - полностью совместимый
posix
режим командной строки. - Вложенные подкоманды
subcommand
. - Поддержка глобальной, локальной, конкатенации
flags
. - использовать
cobra
Легко создавать приложения и команды (cobra init appname
а такжеcobra add cmdname
). - Предоставлять интеллектуальные подсказки (например, вывод
app srver
команда, предложит вам ввестиapp server
? ). - Создано автоматически
commands
а такжеflags
справочная информация. - Автоматически генерировать подробные
help
Информация, такая какapp -help
. - помощь в автоматическом распознавании
flag
,-h
,--help
. - Автоматически генерировать приложения в
bash
Автодополнение для следующей команды. - автоматически сгенерированное приложение
man
руководство. - Псевдоним командной строки.
- настроить
help
а такжеusage
Информация. - опционально с
viper
плотная интеграция.
Для программ командной строки перечисленные выше функции просто созданы специально.
1.3 Пример применения
Cobra
Используется во многих проектах Go, таких как:Kubernetes,Hugoа такжеGithub CLIи т. д., более широко используемые элементы:
(Источник:GitHub.com/commodity13/cobra…)
- Arduino CLI
- Bleve
- CockroachDB
- Cosmos SDK
- Delve
- Docker (distribution)
- Etcd
- Gardener
- gsctl Giant Swarm
- Git Bump
- Github CLI
- GitHub Labeler
- Golangci-lint
- GopherJS
- Helm
- Hugo
- Istio
- Kool
- Kubernetes
- Linkerd
- Mattermost-server
- Metal Stack CLI
- Moby (former Docker)
- Nanobox/Nanopack
- OpenShift
- Ory Hydra
- Ory Kratos
- Pouch
- ProjectAtomic (enterprise)
- Prototool
- Random
- Rclone
- Skaffold
- Tendermint
- Twitch CLI
- Werf
После их прочтения одно слово "нравится" и два слова "отлично"!
понялCobra
позже, посмотрите на этиKubernetes
,etcd
,Registry
Когда я жду код проекта с открытым исходным кодом, я, наверное, умею его читать, и этому я учусьCobra
цель.
2. Концепция
Кобра управляется командами (commands
),параметр(arguments
), опции (flags
) был создан.
Прежде чем подробно разбираться и использовать Cobra, необходимо заранее знать некоторые понятия: команда (commands
),параметр(arguments
), опции (flags
) эти понятия.
- commands: Команда представляет поведение, обычно представляет действие, то есть запущенную службу двоичных команд. Может также иметь дочерние команды
- arguments: Аргументы представляют собой аргументы командной строки.
- flags: параметры представляют собой изменения в поведении командной строки, т. е. параметры командной строки. Параметры конфигурации бинарных команд, которые могут соответствовать конфигурационным файлам. Параметры можно разделить на глобальные параметры и параметры подкоманд.
Лучшие программы командной строки при реальном использовании должны быть похожи на чтение красивого предложения и могут более интуитивно понимать, как взаимодействовать с пользователем. Выполнение программы командной строки должно следовать общему формату:APPNAME VERB NOUN --ADJECTIVE
илиAPPNAME COMMAND ARG --FLAG
.
Например следующий пример:
# server是 commands,port 是 flag
hugo server --port=1313
# clone 是 commands,URL 是 arguments,brae 是 flag
git clone URL --bare
Другой пример:
xcbeyond@xcbeyonddeMacBook-Pro ~ % docker info --help
Usage: docker info [OPTIONS]
Display system-wide information
Options:
-f, --format string Format the output using the given Go template
Вы правильно прочитали. Cobra используется для реализации таких сложных команд, как Docker. В следующем разделе давайте посмотрим, как реализовать набор собственных инструментов командной строки.
3. Cobra Combat
Практика — лучший способ научиться!Этот раздел быстро перенесет вас к Кобре из реального боя.
3.1 Подготовка окружающей среды
3.1.1 Предпосылки и среда
- Операционная система: Mac OS
- Перейти к среде: перейти 1.16
- Разработка IDE для Go: VSCode
(Вышеуказанная среда может определяться личной средой без ограничений)
3.1.2 Установка кобры
использоватьgo get
команда, чтобы получить последнюю версию библиотеки Cobra. Следующая команда установит Cobra и связанные с ней зависимости:
go get -u github.com/spf13/cobra/cobra
После загрузки и установки Cobra откройте каталог GOPATH, и программа cobra (Window: cobra.exe, MacOS: cobra) будет загружена в каталог bin.
3.1.3 Инициализация проекта (генератор кода Cobra)
Предположим, вам нужно разработать программу командной строки на основе интерфейса командной строки Cobra с именемcobra-demo
.
Поскольку Cobra предоставляет функцию генератора кода, мы можем напрямую использовать команду инициализации, предоставляемую Cobra.cobra init
Создайте проект Cobra для быстрой инициализации.
переключиться наGOPATH
каталог (например,/Users/xcbeyond/github
), выполнение заказаcobra init <name> --pkg-name <pkgname>
,следующим образом:
xcbeyond@xcbeyonddeMacBook-Pro github % .\bin\cobra init cobra-demo --pkg-name github.com/xcbeyond/cobra-demo
Your Cobra application is ready at
/Users/xcbeyond/github/cobra-demo
После успешной инициализации структура каталогов программы cobra-demo выглядит следующим образом:
.
├── cmd
│ ├── root.go
│ └── show.go
├── go.mod
├── go.sum
└── main.go
3.1.4 Бег
Выполнение заказаgo run
бегать:
xcbeyond@xcbeyonddeMacBook-Pro cobra-demo % go run main.go
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.
3.2 Настоящий бой
Вот простойtime
Командование в качестве примера, фактический бой объясняет, как развить команду в Cobra.
Функции следующие:
-
show
: просмотр текущего времени. -
parse
: укажите формат времени –format, parse является подкомандой show.
3.2.1 Реализация команды show (Командная команда)
-
добавить команду шоу
по команде
cobra add
Добавьте команду шоу:xcbeyond@xcbeyonddeMacBook-Pro cobra-demo % ../bin/cobra add show show created at /Users/xcbeyond/github/cobra-demo
На этом этапе каталог проекта создаст
show.go
файл, в котором может быть завершена конкретная логика работы команды.Ниже
show.go
Исходный код файла:// showCmd represents the show command var showCmd = &cobra.Command{ Use: "show", Short: "A brief description of your command", Long: `A longer description that spans multiple lines and likely contains examples and usage of using your command. 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.`, Run: func(cmd *cobra.Command, args []string) { fmt.Println("show called") }, } func init() { rootCmd.AddCommand(showCmd) // Here you will define your flags and configuration settings. // Cobra supports Persistent Flags which will work for this command // and all subcommands, e.g.: // showCmd.PersistentFlags().String("foo", "", "A help for foo") // Cobra supports local flags which will only run when this command // is called directly, e.g.: // showCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") }
&cobra.Command
В качестве определения команды существуют следующие переменные:-
Use
: Используется для указания конкретных команд, таких как: show. -
Short
: Краткое описание команды. -
Long
: Подробное описание команды. -
Run
: Запись выполнения команды, используемая для реализации конкретной логики обработки команды.
rootCmd.AddCommand(showCmd)
Добавление команд, добавляет команду к корневой команде. (Cobra поддерживает подкоманды команд) -
-
Реализовать логику для отображения текущего времени
Добавьте логику для получения текущего времени в &cobra.Command.Run
time.Now()
:var showCmd = &cobra.Command{ Use: "show", Short: "A brief description of your command", Long: `A longer description that spans multiple lines and likely contains examples and usage of using your command. 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.`, Run: func(cmd *cobra.Command, args []string) { // show current time fmt.Println(time.Now()) }, }
-
Изменить команду справки
Есть две команды справки, одна короткая, а другая - Lang. Очевидно, что короткая команда используется для определения короткого описания, а команда Lang используется для определения подробного описания. Давайте модифицируем справку команды Show:
var showCmd = &cobra.Command{ Use: "show", Short: "Displays the current time", Long: `You can use the time show command to view the current time. For example: $ ./cobra-demo show 2021-03-19 14:34:20.9320241 +0800 CST m=+0.378845301`, Run: func(cmd *cobra.Command, args []string) { // show current time fmt.Println(time.Now()) }, }
-
бегать
Выполните команду шоу:
xcbeyond@xcbeyonddeMacBook-Pro cobra-demo % go run main.go show 2021-07-31 14:49:27.3582836 +0800 CST m=+0.176660901
Выполните команду show –help:
xcbeyond@xcbeyonddeMacBook-Pro cobra-demo % go run main.go show --help You can use the time show command to view the current time. For example: $ ./cobra-demo show 2021-07-31 14:34:20.9320241 +0800 CST m=+0.378845301 Usage: cobra-demo show [flags] Flags: -h, --help help for show Global Flags: --config string config file (default is $HOME/.cobra-demo.yaml)
4. Резюме
Cobra-demo просто кратко объяснил, что он состоит из нескольких частей.В реальных проектах это намного сложнее.Как правило, он имеет несколько подкоманд, но основное содержание похоже.