本文是阅读urfave/cli包官方文档的一些笔记,原文在这里!!
介绍
cli是一个简单、快速、有趣的包,用于在Go中构建命令行应用程序。其目标是使开发人员能够以表达的方式编写快速且可分发的命令行应用程序。
Getting Started
使用非常简单,理论上创建一个cli.App
结构的对象,然后调用其Run()
方法,传入命令行的参数即可。一个空白的cli
应用程序如下:
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...]
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--help, -h show help (default: false)
在上面空白程序基础上加上执行特定操作的动作
package main
import (
"fmt"
"log"
"os"
"github.com/urfave/cli/v2"
)
func main() {
app := &cli.App{
Name: "boom",
Usage: "make an explosive entrance",
Action: func(c *cli.Context) error {
fmt.Println("boom! I say!")
return nil
},
}
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
}
运行上面的程序会执行Action定义的函数。上面的代码中设置了Name/Usage/Action
。Name
和Usage
都显示在帮助中,Action
是调用该命令行程序时实际执行的函数,需要的信息可以从参数cli.Context
获取。
参数
通过cli.Context
的相关方法我们可以获取传给命令行的参数信息:
NArg()
:返回参数个数;Args()
:返回cli.Args
对象,调用其Get(i)
获取位置i
上的参数。
package main
import (
"fmt"
"log"
"os"
"github.com/urfave/cli/v2"
)
func main() {
app := &cli.App{
Action: func(c *cli.Context) error {
fmt.Printf("Hello %q\n",context.Args().Get(0))
fmt.Printf("The number of arguments:%d\n",context.NArg())
return nil
},
}
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
}
选项(Flags)
一个好用的命令行程序怎么会少了选项呢?cli
设置和获取选项非常简单。在cli.App{}
结构初始化时,设置字段Flags
即可添加选项。Flags
字段是[]cli.Flag
类型,cli.Flag
实际上是接口类型。cli
为常见类型都实现了对应的XxxFlag
,如BoolFlag/DurationFlag/StringFlag
等。它们有一些共用的字段,Name/Value/Usage
(名称/默认值/释义)。看示例:
package ma in
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" {