Golang 命令模块 urfave/cli 的使用方法
urfave/cli:
cli是一个用于在Go中构建命令行应用程序的简单、快速和有趣的包。其目标是使开发人员能够以一种富有表现力的方式编写快速且可分发的命令行应用程序
这里我们我们不做翻译,原文内容比较晦涩翻译过程比较累,我来讲解一下使用技巧
安装
这里我们配置 go module
这点官方推荐的,我不使用go module 好像没有安装成功。 具体配置方法见
配置一下环境变量
MAC下
> vim ~/.bash_profile
-> 写入操作
> export GO111MODULE=on
> sorucre ~/.bash_profile
-> 回到自己的项目目录下
> go get github.com/urfave/cli/v2
> go get github.com/urfave/cli
windows 这里不做介绍 操作相同哈
基础知识
cli 差不多是基于 flag 来开发的哈,我们需要了解一下 flag 包的的使用哈,这里简要说明一下flag接受语法,后面要用到的
-isbool (一个 - 符号,布尔类型该写法等同于 -isbool=true)
-age=x (一个 - 符号,使用等号)
-age x (一个 - 符号,使用空格)
--age=x (两个 - 符号,使用等号)
--age x (两个 - 符号,使用空格)
正文
example
1、初始化一个cli命令
maio.go
package main
import (
"os"
"github.com/urfave/cli/v2"
)
func main() {
(&cli.App{}).Run(os.Args)
}
输出
NAME:
main - A new cli application // 该条命令描述
USAGE:
main [global options] command [command options] [arguments...] // 使用方式 maio:代表执行脚本,global options: 命令参数 command: 参数值
COMMANDS:
help, h Shows a list of commands or help for one command // 显示一个命令的命令或帮助列表, 使用如: go main.go help 或则 go main.go h ( h为别名 )
GLOBAL OPTIONS:
--help, -h show help (default: false) // 默认选项值
2、
maio.go
package main
import (
"fmt"
"log"
"os"
"github.com/urfave/cli/v2"
)
func main() {
app := &cli.App{
Name: "我是脚本名称",
Usage: "我是使用方法描述",
Action: func(c *cli.Context) error {
fmt.Println("我被你执行了")
return nil
},
}
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
}
输出
我被你执行了
Action 则表示当前脚本执行函数,可以自由调用其他函数
3、使用 flags
package main
import (
"fmt"
"log"
"os"
"github.com/urfave/cli/v2"
)
func main() {
app := &cli.App{
Flags: []cli.Flag {
&cli.StringFlag{
Name: "lang",
Value: "english",
Usage: "language for the greeting",
},
},
Action: func(c *cli.Context) error {
name := "Nefertiti"
if c.NArg() > 0 {
name = c.Args().Get(0)
}
if c.String("lang") == "spanish" {
fmt.Println("Hola", name)
} else {
fmt.Println("Hello", name)
}
return nil
},
}
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
}
>go run main.go --lang=spanish
Hola Nefertiti
>go run main.go --lang=surest
Hello Nefertiti
可以看到,通过flags传参,我们可以更好的配置我们想要执行的对应函数和结果
3、配置别名和占位符
这地地方官方文档写的有点绕,我们来解释一下, 如上函数,我们使用 go run main.go -h
或者 go run main.go -help
得到结果如下
NAME:
main - A new cli application
USAGE:
main [global options] command [command options] [arguments...]
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--lang value language for the greeting (default: "english")
--help, -h show help (default: false)
- 通过help可以得知,我们使用 flags : --lang 来进行传入flags参数,同样如果我们想 通过 直接 -l 来传入参数呢,这样就需要我们的别名了
二次修改
Name: "lang",
Value: "english",
Aliases: []string{"l"},
Usage: "language for the greeting",
-- help 结果
GLOBAL OPTIONS:
--lang value, -l value language for the greeting (default: "english")
--help, -h show help (default: false)
可以看到,我们的参数描述新增了 -l value
,由此,我们可以通过 go run main -l=spanish
来得到我们想要的结果
GLOBAL OPTIONS
描述中,--lang value ,他默认则为key value 格式,value 表示其值,但是我们有时候想改value
呢
三次修改
Name: "lang",
Value: "english",
Aliases: []string{"l"},
Usage: "language for the greeting `啥语言`"
-- help 结果
GLOBAL OPTIONS:
--lang 啥语言, -l 啥语言 language for the greeting 啥语言 (default: "english")
是不是一目了然
4、如果我想执行多条命令呢,例如,我写了一个获取年龄的,一个获取性别的函数怎么弄呢
package main
import (
"fmt"
"log"
"os"
"sort"
"github.com/urfave/cli/v2"
)
func main() {
app := &cli.App{
Commands: []*cli.Command{
{
Name: "sex",
Aliases: []string{"s"},
Usage: "你可以通过我来获取性别",
Action: func(c *cli.Context) error {
fmt.Println("难人")
return nil
},
},
{
Name: "age",
Aliases: []string{"a"},
Usage: "你可以通过我来获取年龄",
Action: func(c *cli.Context) error {
fmt.Println("100岁了")
return nil
},
},
},
}
sort.Sort(cli.CommandsByName(app.Commands)) // 通过命令函数来排序,在help中进行展示
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
}
我们这里来编译一下
> go build main.go
> ./main -h
NAME:
main - A new cli application
USAGE:
main [global options] command [command options] [arguments...]
COMMANDS:
age, a 你可以通过我来获取年龄
sex, s 你可以通过我来获取性别
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--help, -h show help (default: false)
> ./main age
100岁了
> ./main age
难人
5、到这里差不多可以了吧 ~~ 更高级的用法可以自己更加细致研究看看 如上基本满足日常需求了
见文档库例
https://github.com/urfave/cli/blob/master/docs/v2/manual.md
本文由 邓尘锋 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Mar 22, 2021 at 04:57 pm