Добавить Автора
Блог:В следующий раз после. can /blog/go wave…
смотрел недавноIstio(ОдинService MeshFramework) Связанные вещи и нашли новую вещь при рассмотрении своего исходного кода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 просто кратко объяснил, что он состоит из нескольких частей.В реальных проектах это намного сложнее.Как правило, он имеет несколько подкоманд, но основное содержание похоже.