cobra
的主要功能是创建强大的现代 cli 应用程序。目前市面上许多的著名的 Go
语言开源项目都是使用 Cobra 来构建的,例如:K8s、Hugo、etcd、Docker
等,是非常可靠的一个开源项目。
没有 cobra 之前用什么
如果不用 cobra,我们也可以使用 go 自带的 flag 标准库
flag 的基本用法
下面代码中,我们调用标准库 flag 的
StringVar 方法实现了对命令行参数 name
的解析和绑定,其各个形参的含义分别为命令行标识位的名称、默认值、帮助信息。
命令行参数支持如下三种命令行标志语法:
-flag 仅支持布尔类型
-flag x 仅支持非布尔类型
-flag=x 均支持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
package main
import ( "flag" "fmt" )
funcmain() { var name string // 名称为 name、默认值为 "Go go go!" flag.StringVar(&name, "name", "Go go go!", "帮助信息") flag.StringVar(&name, "n", "Go go go!", "帮助信息") flag.Parse()
fmt.Printf("name: %s\n", name) }
执行:
1 2 3
// 均输出 abc go run main.go -name=abc go run main.go -n=abc
子命令实现
在我们日常使用的 CLI
应用中,另一个最常见的功能就是子命令的使用,一个工具它可能包含大量相关联的功能命令以此形成工具集,可以说是刚需,那么这个功能在标准库
flag 中可以如何实现呢,如下述示例:
➜ go run main.go go 2022/08/04 08:59:21 name: Go 语言 ➜ go run main.go php 2022/08/04 09:00:54 name: PHP 语言 ➜ go run main.go php -n abc 2022/08/04 09:01:05 name: abc