使用 Go 语言编写命令行程序经常会使用了urfave/cli这个库,比如以太坊软件 geth。
在 C 语言中,我们需要根据 argc/argv 解析命令行参数,调用不同的函数,最后还要写一个 usage() 函数用于打印帮助信息。urfave/cli 把这个过程做了一下封装,抽象出 flag/command/subcommand 这些模块,用户只需要提供一些模块的配置,参数的解析和关联在库内部完成,帮助信息也可以自动生成。
举个例子,我们想要实现下面这个命令行程序:
NAME: GoTest - hello world USAGE: GoTest [global options] command [command options] [arguments...] VERSION: 1.2.3 COMMANDS: help, h Shows a list of commands or help for one command arithmetic: add, a calc 1+1 sub, s calc 5-3 database: db database operations GLOBAL OPTIONS: --lang FILE, -l FILE read from FILE (default: "english") --port value, -p value listening port (default: 8000) --help, -h Help!Help! --print-version, -v print version
1. 基本结构
导入包以后,通过 cli.NewApp() 创建一个实例,然后调用 Run() 方法就实现了一个最基本的命令行程序了。当然,为了让我们的程序干点事情,可以指定一下入口函数app.Action,具体写法如下:
import ( "fmt" "gopkg.in/urfave/cli.v1" ) func main() { app := cli.NewApp() app.Action = func(c *cli.Context) error { fmt.Println("BOOM!") return nil } err := app.Run(os.Args) if err != nil { log.Fatal(err) } }
2. 公共配置
帮助里需要显示的一些基本信息:
app.Name = "GoTest" app.Usage = "hello world" app.Version = "1.2.3"
3. Flag配置
具体对应于帮助中的以下信息: