很多用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配置
具体对应于帮助中的以下信息:
--