Простая и удобная в использовании библиотека для создания командных строковых приложений на Go. Включает выполнение команд, цветовые стили, отображение данных, отображение прогресса, интерактивные методы и т.д.
Русское описание доступно в README.ru
## Основные возможности
flag:"name=int0;shorts=i;required=true;desc=int option message"
опция/флаг
- поддержка привязки опции --long
, поддержка добавления коротких опций(-s
)
-a -b
= -ab
)Required
, указывающей на обязательный параметр опцииValidator
, который позволяет кастомизировать параметры валидации вводааргумент
- поддержка привязки аргумента для указания имени
required
, optional
, array
настроекcolorable
- поддержка богатого цветного вывода. предоставляемая gookit/color
info, error, success, danger
и другие, которые можно использовать напрямуюinteract
Встроенные методы взаимодействия с пользователем: ReadLine
, Confirm
, Select
, MultiSelect
. . .progress
Встроенные методы отображения прогресса: Txt
, Bar
, Loading
, RoundTrip
, DynamicText
. . .zsh
и bash
.-
или --
, и первый символ должен быть буквой.--long
--long значение
.-s -a значение
.--tag php --tag go
вернет tag: [php, go]
.Аргументы флагов:
go get github.com/gookit/gcli/v3
пример для быстрого старта:
package main
import (
"github.com/gookit/gcli/v3"
"github.com/gookit/gcli/v3/_examples/cmd"
)
// для тестового запуска: go build ./_examples/cliapp.go && ./cliapp
func main() {
app := gcli.NewApp()
app.Version = "1.0.3"
app.Desc = "это мое консольное приложение"
// app.SetVerbose(gcli.VerbDebug)
app.Add(cmd.Example)
app.Add(&gcli.Command{
Name: "demo",
// разрешает цветные теги и {$cmd} будет заменено на 'demo'
Desc: "это описание <info>сообщение</> для {$cmd}",
Subs: []*gcli.Command {
// ... разрешает добавление подкоманд
},
Aliases: []string{"dm"},
Func: func (cmd *gcli.Command, args []string) error {
gcli.Print("привет, в команде demo\n")
return nil
},
})
// .... добавить больше ...
app.Run(nil)
}
привязка флагов и управление осуществляются встроенным gflag.go
, что позволяет привязывать опции флагов и аргументы.### Привязка опций
gcli поддерживает несколько методов для привязки опций флагов.
Доступные методы:
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)
Примеры использования:
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, "опция типа bool")
// обратите внимание, что `DIRECTORY` будет заменено на значение опции
cmd.StrOpt(&dir, "dir", "d", "", "опция `DIRECTORY`")
// установка имени опции и короткого имени опции
cmd.StrOpt(&opt, "opt", "o", "", "сообщение об опции")
// установка специальной переменной опции, которая должна реализовать интерфейс flag.Value
cmd.VarOpt(&names, "names", "n", "сообщение об опции")
package main
import (
"fmt"
"github.com/gookit/gcli/v3"
)type userOpts struct {
Int int `flag:"name=int0;shorts=i;required=true;desc=опция int message"`
Bol bool `flag:"name=bol;shorts=b;desc=опция bool message"`
Str1 string `flag:"name=str1;shorts=o,h;required=true;desc=опция str1 message"`
// использование указателя
Str2 *string `flag:"name=str2;required=true;desc=опция str2 message"`
// пользовательский тип и реализация flag.Value
Verb0 gcli.VerbLevel `flag:"name=verb0;shorts=V;desc=опция verb0 message"`
// использование указателя
Verb1 *gcli.VerbLevel `flag:"name=verb1;desc=опция verb1 message"`
}```go
func main() {
astr := "xyz"
verb := gcli.VerbWarn
cmd := gcli.NewCommand("test", "описание")
// fs := gcli.NewFlags("test")
// err := fs.FromStruct(&userOpts{
err := cmd.FromStruct(&userOpts{
Str2: &astr,
Verb1: &verb,
})
fmt.Println(err)
}
Описание аргументов:
Доступные методы:
Add(arg Argument) *Argument
AddArg(name, desc string, requiredAndArrayed ...bool) *Argument
AddArgByRule(name, rule string) *Argument
AddArgument(arg *Argument) *Argument
BindArg(arg Argument) *Argument
Примеры использования:
cmd.AddArg("arg0", "первый аргумент, обязательный", true)
cmd.AddArg("arg1", "второй аргумент, обязательный", true)
cmd.AddArg("arg2", "третий аргумент, необязательный", false)
cmd.AddArg("arrArg", "четвертый аргумент, массив", false, true)
Также можно использовать Arg()/BindArg()
для добавления объекта gcli.Argument
:
cmd.Arg("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,
})
Используйте AddArgByRule
:
cmd.AddArgByRule("arg2", "добавляет аргумент по строковому правилу;обязательно;23")
app := gcli.NewApp()
app.Version = "1.0.3"
app.Desc = "это мое приложение командной строки"
// app.SetVerbose(gcli.VerbDebug)
```go
app.Add(cmd.Example)
app.Add(&gcli.Command{
Name: "demo",
// разрешает цветные теги и {$cmd} будет заменен на 'demo'
Desc: "это описание <info>сообщение</> для {$cmd}",
Subs: []*gcli.Command {
// уровень 1: подкоманды...
{
Name: "remote",
Desc: "команда для удаленного доступа в git",
Aliases: []string{"rmt"},
Func: func(c *gcli.Command, args []string) error {
dump.Println(c.Path())
return nil
},
Subs: []*gcli.Command{
// уровень 2: подкоманды...
// {}
}
},
// ... разрешает добавление подкоманд
},
Aliases: []string{"dm"},
Func: func (cmd *gcli.Command, args []string) error {
gcli.Print("привет, в команде demo\n")
return nil
},
})
Сборка примера приложения как demo
$ go build ./_examples/cliapp
Отображение версии
$ ./cliapp --version
# или используйте -V
$ ./cliapp -V
Отображение справки по приложению
через
./cliapp
или./cliapp -h
или./cliapp --help
Примеры:
./cliapp
./cliapp -h # также можно
./cliapp --help # также можно
Запуск команды
Формат:
./cliapp COMMAND [--OPTION VALUE -S VALUE ...] [ARGUMENT0 ARGUMENT1 ...]
./cliapp COMMAND [--OPTION VALUE -S VALUE ...] SUBCOMMAND [--OPTION ...] [ARGUMENT0 ARGUMENT1 ...]
Пример запуска:
$ ./cliapp example -c some.txt -d ./dir --id 34 -n tom -n john val0 val1 val2 arrVal0 arrVal1 arrVal2
Вы можете увидеть:
Отображение справки по команде
через
./cliapp example -h
или./cliapp example --help
Сообщения об ошибках команд
import "github.com/gookit/gcli/v3/builtin"
// ...
// добавить команду gen (если команда выполнена успешно, ее можно удалить)
app.Add(builtin.GenAutoComplete())
Скомпилировать и запустить команду (Эта команда может быть удалена после успешного выполнения.):
$ go build ./_examples/cliapp.go && ./cliapp genac -h // отображение справки
$ go build ./_examples/cliapp.go && ./cliapp genac // запуск команды gen
увидите:
INFO:
{shell:zsh binName:cliapp output:auto-completion.zsh}
Теперь, будет записано содержимое в файл auto-completion.zsh
Продолжить? [yes|no](по умолчанию yes): y
OK, файл автозавершения сгенерирован успешно
После выполнения, будет сгенерирован файл
auto-completion.{zsh|bash}
в текущей директории, и имя среды выполнения будет автоматически получено. Конечно, вы можете указать его вручную во время выполнения
Сгенерированный файл скрипта среды выполнения ссылается на:
Предварительный просмотр:
команда позволяет устанавливать поля:- Name
имя команды.
Desc
описание команды.Aliases
псевдонимы команды.Config
функция конфигурации команды, будет вызвана при инициализации.Subs
добавление подкоманд, позволяет использовать многоуровневые подкоманды.Func
обратный вызов функции обработки команды.var MyCmd = &gcli.Command{
Name: "demo",
// разрешены цветные теги и {$cmd} будет заменен на 'demo'
Desc: "это описание <info>сообщения</info> для команды {$cmd}",
Aliases: []string{"dm"},
Func: func (cmd *gcli.Command, args []string) error {
gcli.Print("привет, в команде demo\n")
return nil
},
// разрешено добавление многоуровневых подкоманд
Subs: []*gcli.Command{},
}
исходный файл находится по адресу: example.go
package main
import (
"fmt"
"github.com/gookit/color"
"github.com/gookit/gcli/v3"
"github.com/gookit/goutil/dump"
)
// опции для команды
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</cyan> 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", "сообщение об опции")
}
``````go
// привязка аргументов
c.AddArg("arg0", "первый аргумент, обязательный", 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 {
color.Infoln("привет, в команде example")
if exampleOpts.showErr {
return c.Errorf("О, произошла ошибка!!")
}
magentaln := color.Magenta.Println
color.Cyanln("Все опции:")
// fmt.Printf("%+v\n", exampleOpts)
dump.V(exampleOpts)
color.Cyanln("Оставшиеся аргументы:")
// fmt.Printf("%v\n", args)
dump.P(args)
magentaln("Получение аргумента по имени:")
arr := c.Arg("arg0")
fmt.Printf("именованный аргумент '%s', значение: %#v\n", arr.Name, arr.Value)
magentaln("Все именованные аргументы:")
for _, arg := range c.Args() {
fmt.Printf("- именованный аргумент '%s': %+v\n", arg.Name, arg.Value)
}
return nil
}
go build ./_examples/cliapp.go && ./cliapp example -h
Пакет progress
предоставляет отображение прогресс-бара в терминале.
Например: Txt
, Bar
, Loading
, RoundTrip
, DynamicText
...
progress.Bar
прогресс-барДемо: ./cliapp prog bar
progress.Txt
текстовая прогресс-барДемо: ./cliapp prog txt
progress.LoadBar
загрузочный прогресс-барprogress.Counter
счетчикprogress.RoundTrip
круговой прогресс-бар[=== ] -> [ === ] -> [ === ]
```-
progress.DynamicText
динамическое текстовое сообщение
Примеры:
package main
import (
"time"
"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("Ваше имя?")
password := interact.ReadPassword("Ваш пароль?")
ok := interact.Confirm("Подтвердите продолжение?")
if !ok {
// выполните что-то...
}
fmt.Printf("Имя: %s, Пароль: %s\n", username, password)
}
чтение сообщения ввода пользователя
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)
### Подтверждение сообщения
```go
if interact.Confirm("Подтвердите продолжение") {
fmt.Println(emoji.Render(":smile: Подтверждено"))
} else {
color.Warn.Println("Не подтверждено")
}
pwd := interact.ReadPassword()
color.Comment.Println("ваш введенный пароль: ", pwd)
Использование цвета в терминале gookit/color Поддерживает Windows
cmd.exe
PowerShell
package main
import (
"github.com/gookit/color"
)
func main() {
// простое использование
color.Cyan.Printf("Простое использование цвета %s\n", "color")
// встроенные темы/стили:
color.Info.Tips("сообщение")
color.Info.Prompt("сообщение")
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")
}
Для получения дополнительной информации об использовании библиотеки цвета, пожалуйста, посетите gookit/color
inhere/console
https://github/inhere/php-console
issue9/term
https://github.com/issue9/term
beego/bee
https://github.com/beego/bee
MIT
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )