A simple to use command line application, written using golang.
Since
v2.3.0
, option binding and argument binding have been reconstructed, which may be incompatible with the previous ones.
中文说明请看 README.zh-CN
option/flag
Support option binding --long
, support for adding short options(-s
)
-a -b
= -ab
)Required
, indicating a required option parameterValidator
, which can customize the validation input parametersargument
Support binding argument to specify name
required
, optional, array
settingscolorable
Supports rich color output. provide by gookit/color
info, error, success, danger
and other styles, can be used directlyinteract
Built-in user interaction methods: ReadLine
, Confirm
, Select
, MultiSelect
...progress
Built-in progress display methods: Txt
, Bar
, Loading
, RoundTrip
, DynamicText
...zsh
and bash
command completion script filesgo get github.com/gookit/gcli/v2
package main
import (
"runtime"
"github.com/gookit/gcli/v2"
"github.com/gookit/gcli/v2/_examples/cmd"
)
// for test run: go build ./_examples/cliapp.go && ./cliapp
func main() {
app := gcli.NewApp()
app.Version = "1.0.3"
app.Description = "this is my cli application"
// app.SetVerbose(gcli.VerbDebug)
app.Add(cmd.ExampleCommand())
app.Add(&gcli.Command{
Name: "demo",
// allow color tag and {$cmd} will be replace to 'demo'
UseFor: "this is a description <info>message</> for {$cmd}",
Aliases: []string{"dm"},
Func: func (cmd *gcli.Command, args []string) error {
gcli.Print("hello, in the demo command\n")
return 0
},
})
// .... add more ...
app.Run()
}
% go build ./_examples/cliapp.go
% ./cliapp --version
# or use -V
% ./cliapp -V
by
./cliapp
or./cliapp -h
or./cliapp --help
Examples:
./cliapp
./cliapp -h # can also
./cliapp --help # can also
./cliapp COMMAND [--OPTION VALUE -S VALUE ...] [ARGUMENT0 ARGUMENT1 ...]
% ./cliapp example -c some.txt -d ./dir --id 34 -n tom -n john val0 val1 val2 arrVal0 arrVal1 arrVal2
you can see:
by
./cliapp example -h
or./cliapp example --help
import "github.com/gookit/gcli/v2/builtin"
// ...
// add gen command(gen successful you can remove it)
app.Add(builtin.GenAutoComplete())
Build and run command(This command can be deleted after success.):
% go build ./_examples/cliapp.go && ./cliapp genac -h // display help
% go build ./_examples/cliapp.go && ./cliapp genac // run gen command
will see:
INFO:
{shell:zsh binName:cliapp output:auto-completion.zsh}
Now, will write content to file auto-completion.zsh
Continue? [yes|no](default yes): y
OK, auto-complete file generate successful
After running, it will generate an
auto-completion.{zsh|bash}
file in the current directory, and the shell environment name is automatically obtained. Of course you can specify it manually at runtime
Generated shell script file ref:
Preview:
app.Add(&gcli.Command{
Name: "demo",
// allow color tag and {$cmd} will be replace to 'demo'
UseFor: "this is a description <info>message</> for command {$cmd}",
Aliases: []string{"dm"},
Func: func (cmd *gcli.Command, args []string) error {
gcli.Print("hello, in the demo command\n")
return nil
},
})
the source file at: example.go
package cmd
import (
"fmt"
"github.com/gookit/color"
"github.com/gookit/gcli/v2"
)
// options for the command
var exampleOpts = struct {
id int
c string
dir string
opt string
names gcli.Strings
}{}
// ExampleCommand command definition
var ExampleCommand = &gcli.Command{
Name: "example",
UseFor: "this is a description message",
Aliases: []string{"exp", "ex"}, // 命令别名
// {$binName} {$cmd} is help vars. '{$cmd}' will replace to '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, "the id option")
c.StrOpt(&exampleOpts.c, "config", "c", "value", "the config option")
// notice `DIRECTORY` will replace to option value type
c.StrOpt(&exampleOpts.dir, "dir", "d", "", "the `DIRECTORY` option")
// 支持设置选项短名称
c.StrOpt(&exampleOpts.opt, "opt", "o", "", "the option message")
// 支持绑定自定义变量, 但必须实现 flag.Value 接口
c.VarOpt(&exampleOpts.names, "names", "n", "the option message")
// 绑定命令参数信息,按参数位置绑定
c.AddArg("arg0", "the first argument, is required", true)
c.AddArg("arg1", "the second argument, is required", true)
c.AddArg("arg2", "the optional argument, is optional")
c.AddArg("arrArg", "the array argument, is array", false, true)
},
Func: exampleExecute,
}
// 命令执行主逻辑代码
// example run:
// 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("hello, in example command\n")
magentaln := color.Magenta.Println
magentaln("All options:")
fmt.Printf("%+v\n", exampleOpts)
magentaln("Raw args:")
fmt.Printf("%v\n", args)
magentaln("Get arg by name:")
arr := c.Arg("arrArg")
fmt.Printf("named array arg '%s', value: %v\n", arr.Name, arr.Value)
magentaln("All named args:")
for _, arg := range c.Args() {
fmt.Printf("named arg '%s': %+v\n", arg.Name, *arg)
}
return nil
}
go build ./_examples/cliapp.go && ./cliapp example -h
Available methods:
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)
Usage examples:
var id int
var b bool
var opt, dir string
var f1 float64
var names gcli.Strings
// bind options
cmd.IntOpt(&id, "id", "", 2, "the id option")
cmd.BoolOpt(&b, "bl", "b", false, "the bool option")
// notice `DIRECTORY` will replace to option value type
cmd.StrOpt(&dir, "dir", "d", "", "the `DIRECTORY` option")
// setting option name and short-option name
cmd.StrOpt(&opt, "opt", "o", "", "the option message")
// setting a special option var, it must implement the flag.Value interface
cmd.VarOpt(&names, "names", "n", "the option message")
About arguments:
Available methods:
Add(arg Argument) *Argument
AddArg(name, desc string, requiredAndIsArray ...bool) *Argument
AddArgument(arg *Argument) *Argument
BindArg(arg Argument) *Argument
Usage examples:
cmd.AddArg("arg0", "the first argument, is required", true)
cmd.AddArg("arg1", "the second argument, is required", true)
cmd.AddArg("arg2", "the optional argument, is optional")
cmd.AddArg("arrArg", "the array argument, is array", false, true)
can also use Arg()/BindArg()
:
cmd.Arg("arg0", gcli.Argument{
Name: "ag0",
Desc: "the first argument, is required",
Require: true,
})
cmd.BindArg("arg0", gcli.Argument{
Name: "ag0",
Desc: "the second argument, is required",
Require: true,
})
cmd.Arg("arg2", gcli.Argument{
Name: "ag0",
Desc: "the third argument, is is optional",
})
cmd.BindArg("arrArg", gcli.Argument{
Name: "arrArg",
Desc: "the third argument, is is array",
IsArray: true,
})
Package progress provide terminal progress bar display.
Such as: Txt
, Bar
, Loading
, RoundTrip
, DynamicText
...
progress.Bar
progress barDemo: ./cliapp prog bar
progress.Txt
text progress barDemo: ./cliapp prog txt
progress.LoadBar
pending/loading progress barprogress.Counter
counterprogress.RoundTrip
round trip progress bar[=== ] -> [ === ] -> [ === ]
progress.DynamicText
dynamic text messageExamples:
package main
import (
"time"
"github.com/gookit/gcli/v2/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()
}
more demos please see progress_demo.go
run demos:
go run ./_examples/cliapp.go prog txt
go run ./_examples/cliapp.go prog bar
go run ./_examples/cliapp.go prog roundTrip
console interactive methods
interact.ReadInput
interact.ReadLine
interact.ReadFirst
interact.Confirm
interact.Select/Choice
interact.MultiSelect/Checkbox
interact.Question/Ask
interact.ReadPassword
Examples:
package main
import (
"fmt"
"github.com/gookit/gcli/v2/interact"
)
func main() {
username, _ := interact.ReadLine("Your name?")
password := interact.ReadPassword("Your password?")
ok := interact.Confirm("ensure continue?")
if !ok {
// do something...
}
fmt.Printf("username: %s, password: %s\n", username, password)
}
read user input message
ans, _ := interact.ReadLine("Your name? ")
if ans != "" {
color.Println("Your input: ", ans)
} else {
color.Cyan.Println("No input!")
}
ans := interact.SelectOne(
"Your city name(use array)?",
[]string{"chengdu", "beijing", "shanghai"},
"",
)
color.Comment.Println("your select is: ", ans)
ans := interact.MultiSelect(
"Your city name(use array)?",
[]string{"chengdu", "beijing", "shanghai"},
nil,
)
color.Comment.Println("your select is: ", ans)
if interact.Confirm("Ensure continue") {
fmt.Println(emoji.Render(":smile: Confirmed"))
} else {
color.Warn.Println("Unconfirmed")
}
pwd := interact.ReadPassword()
color.Comment.Println("your input password is: ", pwd)
Terminal color use gookit/color Support windows
cmd.exe
powerShell
package main
import (
"github.com/gookit/color"
)
func main() {
// simple usage
color.Cyan.Printf("Simple to use %s\n", "color")
// internal theme/style:
color.Info.Tips("message")
color.Info.Prompt("message")
color.Info.Println("message")
color.Warn.Println("message")
color.Error.Println("message")
// custom color
color.New(color.FgWhite, color.BgBlack).Println("custom color style")
// can also:
color.Style{color.FgCyan, color.OpBold}.Println("custom color style")
// use defined color tag
color.Print("use color tag: <suc>he</><comment>llo</>, <cyan>wel</><red>come</>\n")
// use custom color tag
color.Print("custom color tag: <fg=yellow;bg=black;op=underscore;>hello, welcome</>\n")
// set a style tag
color.Tag("info").Println("info style text")
// prompt message
color.Info.Prompt("prompt style message")
color.Warn.Prompt("prompt style message")
// tips message
color.Info.Tips("tips style message")
color.Warn.Tips("tips style message")
}
color.Bold.Println("bold message")
color.Yellow.Println("yellow message")
color.Info.Println("Info message")
color.Danger.Println("Danger message")
color.Error.Println("Error message")
color.Success.Println("Success message")
Support working on windows
cmd.exe
powerShell
// use style tag
color.Print("<suc>he</><comment>llo</>, <cyan>wel</><red>come</>")
color.Println("<suc>hello</>")
color.Println("<error>hello</>")
color.Println("<warning>hello</>")
// custom color attributes
color.Print("<fg=yellow;bg=black;op=underscore;>hello, welcome</>\n")
For more information on the use of color libraries, please visit gookit/color
inhere/console
https://github/inhere/php-console
issue9/term
https://github.com/issue9/term
beego/bee
https://github.com/beego/bee
MIT
Sign in for post a comment
Activity
Community
Health
Trend
Influence
:Code submit frequency
:React/respond to issue & PR etc.
:Well-balanced team members and collaboration
:Recent popularity of project
:Star counts, download counts etc.
Comments ( 0 )