1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/gookit-gcli

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

GCli

GitHub go.mod Go version Actions Status GitHub tag (latest SemVer) Build Status Codacy Badge GoDoc Go Report Card Coverage Status

Простая и удобная в использовании библиотека для создания командных строковых приложений на Go. Включает выполнение команд, цветовые стили, отображение данных, отображение прогресса, интерактивные методы и т.д.

Русское описание

Русское описание доступно в README.ru

Скриншоты

app-cmd-list## Основные возможности

  • Богатый функционалом и удобный в использовании
  • Поддержка добавления нескольких команд и поддержка командных синонимов
  • Поддержка привязки опций команд из структуры
    • пример flag:"name=int0;shorts=i;required=true;desc=int option message"
  • Поддержка добавления многоуровневых команд, каждый уровень команд поддерживает привязку своих собственных опций
  • опция/флаг - поддержка привязки опции --long, поддержка добавления коротких опций(-s)
    • Объединение стилей коротких флагов POSIX (-a -b = -ab)
    • Поддержка установки Required, указывающей на обязательный параметр опции
    • Поддержка установки Validator, который позволяет кастомизировать параметры валидации ввода
  • аргумент - поддержка привязки аргумента для указания имени
    • Поддержка required, optional, array настроек
    • Будет автоматически обнаруживаться и собираться при выполнении команды.
  • colorable - поддержка богатого цветного вывода. предоставляемая gookit/color
    • Поддержка цветного рендеринга в стиле таблицы HTML, совместимого с Windows
    • Встроенные стили 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].

Аргументы флагов:

  • Поддерживает привязку именованных аргументов.
  • Поддерживает определение массива аргументов.

GoDoc

Установка

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                                                     

app-version

Отображение справки по приложению

через ./cliapp или ./cliapp -h или ./cliapp --help

Примеры:

./cliapp
./cliapp -h # также можно
./cliapp --help # также можно

cmd-list

Запуск команды

Формат:

./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

Вы можете увидеть:

run-exampleОтображение справки по команде

через ./cliapp example -h или ./cliapp example --help

cmd-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 обратный вызов функции обработки команды.
  • Дополнительно, см. godoc### Быстрое создание
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{},
}

Написание файла go

исходный файл находится по адресу: 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

cmd-help

Отображение прогресса

Пакет progress предоставляет отображение прогресс-бара в терминале.

Например: Txt, Bar, Loading, RoundTrip, DynamicText ...

  • progress.Bar прогресс-бар

Демо: ./cliapp prog bar

prog-bar

  • progress.Txt текстовая прогресс-бар

Демо: ./cliapp prog txt

prog-txt

  • progress.LoadBar загрузочный прогресс-бар

prog-spinner

  • progress.Counter счетчик
  • progress.RoundTrip круговой прогресс-бар
[===     ] -> [    === ] -> [ ===    ]

prog-rt ```- 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

prog-other

Интерактивные методы

консольные интерактивные методы

  • 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("Нет ввода!")
}

interact-read

Выбор/Выбор

ans := interact.SelectOne(
    "Ваше имя города (используйте массив)?",
    []string{"chengdu", "beijing", "shanghai"},
    "",
)
color.Comment.Println("Ваш выбор: ", ans)

interact-select

Множественный выбор/Чекбокс```go

ans := interact.MultiSelect( "Ваше имя города (используйте массив)?", []string{"chengdu", "beijing", "shanghai"}, nil, ) color.Comment.Println("ваш выбор: ", ans)

![interact-select](_examples/images/interact/m-select.jpg)### Подтверждение сообщения

```go
if interact.Confirm("Подтвердите продолжение") {
    fmt.Println(emoji.Render(":smile: Подтверждено"))
} else {
    color.Warn.Println("Не подтверждено")
}

interact-confirm

Чтение пароля

pwd := interact.ReadPassword()

color.Comment.Println("ваш введенный пароль: ", pwd)

interact-passwd

Цвет в CLI

Использование цвета в терминале gookit/color Поддерживает Windows cmd.exe PowerShell

  • Цветовое отображение

colored-demo

Использование цвета

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

Пакеты gookit

  • gookit/ini Управление конфигурацией Go, использование файлов INI
  • gookit/rux Простой и быстрый маршрутизатор запросов для HTTP в Go
  • gookit/gcli Построение приложений командной строки, библиотека инструментов, выполнение команд CLI
  • gookit/event Легковесный менеджер событий и диспетчер, реализованный на Go
  • gookit/cache Универсальное использование и управление кэшем для Go. Поддерживает файловый, память, Redis, Memcached кэши
  • gookit/config Управление конфигурацией Go. Поддерживает JSON, YAML, TOML, INI, HCL, ENV и флаги
  • gookit/color Библиотека цветов для командной строки с поддержкой истинного цвета, универсальными методами API и поддержкой Windows
  • gookit/filter Предоставляет фильтрацию, очистку и преобразование данных Go
  • gookit/validate Используется для валидации и фильтрации данных. Поддерживает Map, Struct, данные формы
  • gookit/goutil Некоторые утилиты для Go: строки, массивы/слайсы, карты, форматирование, CLI, окружение, файловая система, тестирование и более

См. также- inhere/console https://github/inhere/php-console

Лицензия

MIT

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Go и 5 других языков
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/gookit-gcli.git
git@api.gitlife.ru:oschina-mirror/gookit-gcli.git
oschina-mirror
gookit-gcli
gookit-gcli
master