golang轻量级命令行界面框架插件库ukautz/clif的使用
Golang轻量级命令行界面框架插件库ukautz/clif的使用
ukautz/clif是一个用于快速开发命令行应用程序的Go框架。
安装
$ go get gopkg.in/ukautz/clif.v1
快速开始
基本示例
package main
import "gopkg.in/ukautz/clif.v1"
func main() {
clif.New("My App", "1.0.0", "An example application").
New("hello", "The obligatory hello world", func(out clif.Output) {
out.Printf("Hello World\n")
}).
Run()
}
命令
命令必须有唯一的名称,并且可以有额外的参数和选项。
cmd1 := clif.NewCommand("name", "A description", callBackFunction)
cmd2 := clif.NewCommand("other", "Another description", callBackFunction2)
回调函数
回调函数可以包含任意参数。CLIF使用内置的依赖注入容器。
// 定义类型
type MyFoo struct {
X int
}
func main() {
// 初始化CLI
cli := clif.New("My App", "1.0.0", "An example application")
// 注册对象实例
foo := &MyFoo{X: 123}
cli.Register(foo)
// 创建使用注册实例的回调命令
cli.NewCommand("foo", "Call foo", func (foo *MyFoo) {
// 使用foo做一些事情
})
cli.Run()
}
参数和选项
- 参数:位于命令名称之后,通过位置识别
- 选项:没有固定位置,通过
--opt-name
或-O
识别
参数示例
cmd := clif.NewCommand("hello", "A description", callBackFunction)
.NewArgument("name", "Name for greeting", "", true, false)
arg := cmd.NewAgument("other", "Something ..", "default", false, true)
cmd.AddArgument(arg)
选项示例
cmd := clif.NewCommand("hello", "A description", callBackFunction)
.NewOption("name", "n", "Name for greeting", "", true, false)
arg := cmd.NewOption("other", "O", "Something ..", "default", false, true)
cmd.AddOption(arg)
输入和输出
输入(Input)
func callbackFunctionI(in clif.Input) {
// 任何输入都可以
foo := in.Ask("What is a foo", nil)
// 验证输入
name := in.Ask("Who are you? ", func(v string) error {
if len(v) > 0 {
return nil
} else {
return fmt.Errorf("Didn't catch that")
}
})
// 正则验证简写
count := in.AskRegex("How many? ", regexp.MustCompile(`^[0-9]+$`))
}
输出(Output)
表格输出
var (
headers := []string{"Name", "Age", "Force"}
rows = [][]string{
{"<important>Yoda<reset>", "Very, very old", "Like the uber guy"},
{"<important>Luke Skywalker<reset>", "Not that old", "A bit, but not that much"},
}
)
func callbackFunction(out clif.Output) {
table := out.Table(headers)
table.AddRows(rows)
fmt.Println(table.Render())
}
进度条
func cmdProgress(out clif.Output) error {
pbs := out.ProgressBars()
pb, _ := pbs.Init("default", 200)
pbs.Start()
var wg sync.WaitGroup
wg.Add(1)
go func(b clif.ProgressBar) {
defer wg.Done()
for i := 0; i < 200; i++ {
b.Increment()
<-time.After(time.Millisecond * 100)
}
}(pb)
wg.Wait()
<-pbs.Finish()
}
完整示例
package main
import (
"gopkg.in/ukautz/clif.v1"
"fmt"
"time"
"sync"
)
func main() {
cli := clif.New("My CLI", "1.0.0", "A demo CLI application")
// 添加hello命令
cli.New("hello", "Say hello", func(out clif.Output) {
out.Printf("<success>Hello World!</success>\n")
})
// 添加带参数的命令
cli.New("greet", "Greet someone", func(c *clif.Command) {
name := c.Argument("name").String()
fmt.Printf("Hello, %s!\n", name)
}).NewArgument("name", "Name to greet", "", true, false)
// 添加进度条演示命令
cli.New("progress", "Show progress bar", func(out clif.Output) {
pbs := out.ProgressBars()
pb, _ := pbs.Init("Processing", 100)
pbs.Start()
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
for i := 0; i < 100; i++ {
pb.Increment()
time.Sleep(50 * time.Millisecond)
}
}()
wg.Wait()
<-pbs.Finish()
})
cli.Run()
}
这个示例展示了ukautz/clif框架的基本用法,包括创建命令、处理参数、使用输出格式化和进度条等功能。
更多关于golang轻量级命令行界面框架插件库ukautz/clif的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复