Простая и удобная библиотека для создания командных приложений на Go. Включает в себя выполнение команд, цветовые стили, отображение данных, отображение прогресса, методы взаимодействия и т. д.
Английское описание доступно по ссылке README
## Основные функции
flag:"name=int0;shorts=i;required=true;desc=int option message"
option/flag
быстрое и удобное добавление привязок опций (--long
), поддержка добавления нескольких коротких опций (например: -s
)
Required
Validator
argument
поддержка привязки параметров к определённым именам (параметры — это оставшиеся параметры после привязки флагов)
Required
, массива isArray
colorable
поддержка богатого цветного вывода, реализовано с помощью gookit/color
info
, error
, success
, danger
и др.interact
встроенная поддержка методов взаимодействия с пользователем: ReadLine
, Confirm
, Select
, MultiSelect
и др.progress
встроенная поддержка методов отображения прогресса: Txt
, Bar
, Loading
, RoundTrip
, DynamicText
и др.- При ошибке ввода команды будет выдано сообщение о похожих командах (включая псевдонимы)error
будет автоматически преобразован в сообщение об ошибкеzsh
и bash
для текущего CLI приложенияgo get github.com/gookit/gcli/v3
Вот пример, где можно быстро написать CLI-приложение, импортировав текущий пакет:
package main
import (
"runtime"
"github.com/gookit/gcli/v3"
"github.com/gookit/gcli/v3/_examples/cmd"
)
// Тестовый запуск: go run ./_examples/cliapp.go && ./cliapp
func main() {
app := gcli.NewApp()
app.Version = "1.0.3"
app.Desc = "это мое CLI-приложение"
// app.SetVerbose(gcli.VerbDebug)
app.Add(cmd.Example)
app.Add(&gcli.Command{
Name: "demo",
// разрешено использование цветовых тегов и {$cmd} будет заменено на 'demo'
Desc: "это описание <info>сообщения</> для команды",
Aliases: []string{"dm"},
Func: func(cmd *gcli.Command, args []string) error {
gcli.Println("привет, в команде demo")
return nil
},
})
// .... добавить больше ...
app.Run(nil)
}
Сначала используйте примеры кода из этого проекта, чтобы создать небольшое CLI-приложение.
% go build ./_examples/cliapp.go
Вывод информации о версии, которую вы установили при создании CLI-приложения. Если вы также установили логотип, он также будет отображен.
% ./cliapp --version
# или используйте -V
% ./cliapp -V
./cliapp
или ./cliapp -h
для отображения справки по приложению, включая все доступные команды и некоторые глобальные опции.Пример:
./cliapp
./cliapp -h # также можно использовать
./cliapp --help # также можно использовать
Отображение справки по конкретной команде.
Пример:
./cliapp {command} -h
./cliapp {command} --help
./cliapp help {command}
Если вы ввели неверную команду, но есть похожие по названию, будет показана подсказка.
Синтаксис:
./cliapp КОМАНДА [--ОПЦИЯ ЗНАЧЕНИЕ -S ЗНАЧЕНИЕ ...] [АРГУМЕНТ0 АРГУМЕНТ1 ...]
Пример
./cliapp ex -c some.txt -d ./dir --id 34 -n tom -n john val0 val1 val2 arrVal0 arrVal1 arrVal2
Можно заметить результат сборки опций и аргументов:
import "github.com/gookit/gcli/v3/builtin"
// ...
// Добавление встроенных команд для генерации
app.Add(builtin.GenAutoComplete())
Сборка и запуск команды для генерации (после успешного выполнения команду можно удалить):
% go build ./_examples/cliapp.go && ./cliapp genac -h // Показать справку
% go build ./_examples/cliapp.go && ./cliapp genac // Начать генерацию, вы увидите подобное сообщение
INFO:
{shell:zsh binName:cliapp output:auto-completion.zsh}
Теперь, будет создан файл auto-completion.zsh
Продолжить? [yes|no](по умолчанию yes): y
```OK, файл автозавершения создан успешно
После запуска в текущей директории будет создан файл
auto-completion.{zsh|bash}
, имя оболочки берется автоматически. Конечно, вы можете указать его вручную при запуске.
Сгенерированный файл скрипта оболочки можно посмотреть здесь:
Пример вывода:
app.Add(&gcli.Command{
Name: "demo",
// разрешение на использование цветовых тегов и {$cmd} будет заменено на 'demo'
Desc: "это описание <info>сообщение</> для команды",
Aliases: []string{"dm"},
Func: func (cmd *gcli.Command, args []string) error {
gcli.Print("привет, в команде demo\n")
return nil
},
})
исходный файл находится по адресу: example.go
package cmd
import (
"fmt"
"github.com/gookit/color"
"github.com/gookit/gcli/v3"
)// опции для команды
var exampleOpts = struct {
id int
c string
dir string
opt string
names gcli.Strings
}{}// Определение команды ExampleCommand
var ExampleCommand = &gcli.Command{
Name: "example",
Desc: "это описание команды",
Aliases: []string{"exp", "ex"}, // альтернативные названия команды
// {$binName} {$cmd} - переменные помощи. '{$cmd}' будет заменен на 'example'
Examples: `{$binName} {$cmd} --id 12 -c val ag0 ag1
<cyan>{$fullCmd} --names tom --names john -n c</> test use special option`,
Config: func(c *gcli.Command) {
// привязка информации о параметрах команды
c.IntOpt(&exampleOpts.id, "id", "", 2, "параметр id")
c.StrOpt(&exampleOpts.c, "config", "c", "value", "параметр конфигурации")
// обратите внимание, что `DIRECTORY` будет заменено на тип значения параметра
c.StrOpt(&exampleOpts.dir, "dir", "d", "", "параметр DIRECTORY")
// поддержка установки коротких названий параметров
c.StrOpt(&exampleOpts.opt, "opt", "o", "", "сообщение параметра")
// поддержка привязки пользовательских переменных, но они должны реализовать интерфейс flag.Value
c.VarOpt(&exampleOpts.names, "names", "n", "сообщение параметра")
}
} // Привязка информации о параметрах команды, привязка по позиции параметров
c.AddArg("arg0", "первый обязательный параметр", true)
c.AddArg("arg1", "второй обязательный параметр", true)
c.AddArg("arg2", "необязательный параметр")
c.AddArg("arrArg", "массивный параметр, является массивом", false, true)
},
Func: exampleExecute,
}// Основная логика выполнения команды
// Пример запуска:
// go run ./_examples/cliapp.go ex -c some.txt -d ./dir --id 34 -n tom -n john val0 val1 val2 arrVal0 arrVal1 arrVal2
func exampleExecute(c *gcli.Command, args []string) error {
fmt.Print("Привет, в команде example\n")
magentaln := color.Magenta.Println
magentaln("Все опции:")
fmt.Printf("%+v\n", exampleOpts)
magentaln("Исходные аргументы:")
fmt.Printf("%v\n", args)
magentaln("Получение аргумента по имени:")
arr := c.Arg("arrArg")
fmt.Printf("именованный массивный аргумент '%s', значение: %v\n", arr.Name, arr.Value)
magentaln("Все именованные аргументы:")
for _, arg := range c.Args() {
fmt.Printf("именованный аргумент '%s': %+v\n", arg.Name, *arg)
}
return nil
}
go build ./_examples/cliapp.go && ./cliapp example -h
Справочная информация уже сгенерирована и отображена
Методы для добавления опций:
BoolOpt(p *bool, name, shorts string, defValue bool, desc string)
BoolVar(p *bool, meta FlagMeta)
Float64Opt(p *float64, name, shorts string, defValue float64, desc string)
Float64Var(p *float64, meta FlagMeta)
Int64Opt(p *int64, name, shorts string, defValue int64, desc string)
Int64Var(p *int64, meta FlagMeta)
IntOpt(p *int, name, shorts string, defValue int, desc string)
IntVar(p *int, meta FlagMeta)
StrOpt(p *string, name, shorts, defValue, desc string)
StrVar(p *string, meta FlagMeta)
Uint64Opt(p *uint64, name, shorts string, defValue uint64, desc string)
Uint64Var(p *uint64, meta FlagMeta)
UintOpt(p *uint, name, shorts string, defValue uint, desc string)
UintVar(p *uint, meta FlagMeta)
Var(p flag.Value, meta FlagMeta)
VarOpt(p flag.Value, name, shorts, desc string)
Примеры использования:```go var id int var b bool var opt, dir string var f1 float64 var names gcli.Strings
cmd.IntOpt(&id, "id", "", 2, "опция id")
cmd.BoolOpt(&b, "bl", "b", false, "логическая опция")
// обратите внимание, что `DIRECTORY` будет заменено на значение опции типа
cmd.StrOpt(&dir, "dir", "d", "", "опция `DIRECTORY`")
// установка имени опции и короткого имени опции
cmd.StrOpt(&opt, "opt", "o", "", "сообщение опции")
// установка специальной переменной опции, которая должна реализовывать интерфейс flag.Value
cmd.VarOpt(&names, "names", "n", "сообщение опции")### Привязка параметров
```О параметрах определения:
- **Обязательные** параметры не могут быть определены после **необязательных** параметров.
- Разрешено определение только одного массивного параметра (с несколькими значениями).
- Массивный параметр может быть определен только в конце.
Методы для привязки параметров:
```go
Add(arg Argument) *Argument
AddArg(name, desc string, requiredAndArrayed ...bool) *Argument
AddArgument(arg *Argument) *Argument
BindArg(arg Argument) *Argument
Примеры использования:
cmd.AddArg("arg0", "первый обязательный параметр", true)
cmd.AddArg("arg1", "второй обязательный параметр", true)
cmd.AddArg("arg2", "необязательный параметр")
cmd.AddArg("arrArg", "массивный параметр", false, true)
Также можно использовать Add()/BindArg()
:
cmd.Add("arg0", gcli.Argument{
Name: "ag0",
Desc: "первый обязательный параметр",
Require: true,
})
cmd.BindArg("arg2", gcli.Argument{
Name: "ag0",
Desc: "третий необязательный параметр",
})
cmd.BindArg("arrArg", gcli.Argument{
Name: "arrArg",
Desc: "третий массивный параметр",
Arrayed: true,
})
Параметры можно получить с помощью c.Arg(name string) *gcli.Argument
. С помощью встроенных методов параметры могут быть преобразованы в обычные типы данных.
var MyCommand = &gcli.Command{
Name: "example",
Desc: "пример команды",
Config: func(c *gcli.Command) {
cmd.BindArg("arg0", gcli.Argument{
Name: "ag0",
Desc: "первый обязательный параметр",
Require: true,
})
cmd.Add("arg1", gcli.Argument{
Name: "ag1",
Desc: "второй необязательный параметр",
})
},
Func: func(c *gcli.Command, args []string) error {
arg0 := c.Arg("arg0").String()
arg1 := c.Arg("arg1").Int()
fmt.Println(arg0, arg1)
return nil
},
}
```## Отображение прогресса
- `progress.Bar` — универсальный прогресс-бар.
Пример: `./cliapp prog bar`

- `progress.Txt` — текстовый прогресс-бар.
Пример: `./cliapp prog txt`

- `progress.LoadBar` — загрузка.

- `progress.Counter` — счетчик.
- `progress.RoundTrip` — прогресс-бар, который перемещается туда и обратно.
```text
[=== ] -> [ === ] -> [ === ]
```
- `progress.DynamicText` — динамическое сообщение, которое отображает разные сообщения при достижении различных процентов выполнения.
Пример:
```go
package main
import "time"
import "github.com/gookit/gcli/v3/progress"
func main() {
speed := 100
maxSteps := 110
p := progress.Bar(maxSteps)
p.Start()
for i := 0; i < maxSteps; i++ {
time.Sleep(time.Duration(speed) * time.Millisecond)
p.Advance()
}
p.Finish()
}
Для более подробных примеров и использования, см. progress_demo.go
Запуск примера:
go run ./_examples/cliapp.go prog txt
go run ./_examples/cliapp.go prog bar
go run ./_examples/cliapp.go prog roundTrip
Методы для взаимодействия с пользователем в консоли, включая чтение ввода, подтверждение, одиночный выбор, множественный выбор, вопросы и т.д.
interact.ReadInput
interact.ReadLine
interact.ReadFirst
interact.Confirm
interact.Select/Choice
interact.MultiSelect/Checkbox
interact.Question/Ask
interact.ReadPassword
Пример:
package main
import (
"fmt"
"github.com/gookit/gcli/v3/interact"
)func main() {
username, _ := interact.ReadLine("Your name?")
password := interact.ReadPassword("Your password?")
ok := interact.Confirm("Confirm continuation?")
if !ok {
// execute something...
}
fmt.Printf("name: %s, password: %s\n", username, password)
}
```### Чтение ввода
```go
ans, _ := interact.ReadLine("Ваше имя? ")
if ans != "" {
color.Println("Ваш ввод: ", ans)
} else {
color.Cyan.Println("Нет ввода!")
}
ans := interact.SelectOne(
"Ваш город (используйте массив)?",
[]string{"chengdu", "beijing", "shanghai"},
"",
)
color.Comment.Println("ваш выбор: ", ans)
ans := interact.MultiSelect(
"Ваши города (используйте массив)?",
[]string{"chengdu", "beijing", "shanghai"},
nil,
)
color.Comment.Println("ваши выбор: ", ans)
if interact.Confirm("Подтвердите продолжение") {
fmt.Println(emoji.Render(":smile: Подтверждено"))
} else {
color.Warn.Println("Не подтверждено")
}
pwd := interact.ReadPassword()
color.Comment.Println("ваш введенный пароль: ", pwd)
Дополнительные примеры и использование см. в interact_demo.go
Цветной вывод использует gookit/color, поддерживает работу в окружении Windows
cmd.exe
PowerShell
package main
import (
"github.com/gookit/color"
)
func main() {
// Простое использование
color.Cyan.Printf("Просто использовать %s\n", "цвет")
}
``` // Внутренние темы/стили:
color.Info.Tips("указание")
color.Info.Prompt("указание")
color.Info.Println("сообщение")
color.Warn.Println("предупреждение")
color.Error.Println("ошибка")
// Пользовательский цвет
color.New(color.FgWhite, color.BgBlack).Println("пользовательский стиль цвета") // Также можно:
color.Style{color.FgCyan, color.OpBold}.Println("пользовательский стиль цвета")
// Использование определенного цветного тега
color.Print("использование цветного тега: <suc>he</><comment>llo</>, <cyan>wel</><red>come</>\n")
// Использование пользовательского цветного тега
color.Print("пользовательский цветной тег: <fg=yellow;bg=black;op=underscore;>hello, welcome</>\n")
// Установка стиля тега
color.Tag("info").Println("текст стиля info")
// Вывод сообщений в стиле prompt
color.Info.Prompt("сообщение стиля prompt")
color.Warn.Prompt("сообщение стиля prompt")
// Вывод сообщений в стиле tips
color.Info.Tips("сообщение стиля tips")
color.Warn.Tips("сообщение стиля tips")
}
// Установка только фона
color.BgRed.Printf("Просто использовать %s\n", "цвет")
// Установка только переднего плана
color.FgCyan.Printf("Просто использовать %s\n", "цвет")
// Полная настройка переднего плана, фона и опций
style := color.New(color.FgWhite, color.BgBlack, color.OpBold)
style.Println("пользовательский стиль цвета")
// Также можно:
color.Style{color.FgCyan, color.OpBold}.Println("пользовательский стиль цвета")
color.Bold.Println("жирное сообщение")
color.Yellow.Println("желтое сообщение")
Расширение темы стилей:
color.Info.Println("сообщение info")
color.Success.Println("сообщение success")
Также поддерживается использование цветных тегов в окружении Windows
cmd.exe
PowerShell
. Использование цветовых меток позволяет очень удобно и просто создавать любой необходимый формат.```go // Использование встроенных цветовых меток color.Print("he</>llo</>, wel</>come</>") color.Println("hello</>") color.Println("hello</>") color.Println("hello</>")
// Настройка пользовательских цветовых атрибутов color.Print("<fg=yellow;bg=black;op=underscore;>hello, welcome</>\n")
> **Для получения дополнительной информации о использовании библиотеки цветов посетите [gookit/color](https://github.com/gookit/color)**
## Инструменты Gookit- [gookit/ini](https://github.com/gookit/ini) Управление конфигурациями INI, поддержка загрузки нескольких файлов, слияние данных, парсинг переменных ENV, парсинг ссылок на переменные
- [gookit/rux](https://github.com/gookit/rux) Простой и быстрый маршрутизатор запросов для HTTP в Go
- [gookit/gcli](https://github.com/gookit/gcli) Библиотека для создания командных линейных приложений на Go, поддержка цветов в командной строке, пользовательского взаимодействия, отображения прогресса, форматированного отображения данных
- [gookit/event](https://github.com/gookit/event) Легковесная библиотека для управления событиями и планирования задач на Go, поддержка настройки приоритета слушателей, слушателей групп событий
- [gookit/cache](https://github.com/gookit/cache) Общая библиотека для использования кэша, предоставляющая унифицированный API для различных драйверов
- [gookit/config](https://github.com/gookit/config) Управление конфигурациями Go, поддержка различных форматов (JSON, YAML, TOML, INI, HCL, ENV, Flags), загрузка нескольких файлов, загрузка удаленных файлов, слияние данных
- [gookit/color](https://github.com/gookit/color) Библиотека для рендеринга цветов в командной строке, имеет простой API, поддерживает 16 цветов, 256 цветов, RGB цвета
- [gookit/filter](https://github.com/gookit/filter) Фильтрация, очистка и преобразование данных Go
- [gookit/validate](https://github.com/gookit/validate) Общая библиотека для валидации и фильтрации данных Go, простое использование, включает большинство стандартных валидаторов и фильтров
- [gookit/goutil](https://github.com/gookit/goutil)com/gookit/goutil) Набор утилит Go, включая форматирование, специальные обработчики, получение информации и т. д.
- Для получения дополнительной информации посетите https://github.com/gookit## Ссылки на проекты
- `issue9/term` https://github.com/issue9/term
- `beego/bee` https://github.com/beego/bee
- `inhere/console` https://github/inhere/php-console
- [ANSI Escape Codes](https://ru.wikipedia.org/wiki/ANSI_Escape_Codes)
- [Standard ANSI color map](https://conemu.github.io/en/AnsiEscapeCodes.html#Standard_ANSI_color_map)
- go package: `golang.org/x/crypto/ssh/terminal`
## Лицензия
MIT
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )