长沙需要做网站的企业,精品外贸网站 dedecms,人才市场官方网站,萨隆wordpresscobra 是什么
cobra 的主要功能是创建强大的现代 cli 应用程序。目前市面上许多的著名的 Go 语言开源项目都是使用 Cobra 来构建的#xff0c;例如#xff1a;K8s、Hugo、etcd、Docker 等#xff0c;是非常可靠的一个开源项目。
没有 cobra 之前用什么
如果不用 cobra例如K8s、Hugo、etcd、Docker 等是非常可靠的一个开源项目。
没有 cobra 之前用什么
如果不用 cobra我们也可以使用 go 自带的 flag 标准库
flag 的基本用法
下面代码中我们调用标准库 flag 的 StringVar 方法实现了对命令行参数 name 的解析和绑定其各个形参的含义分别为命令行标识位的名称、默认值、帮助信息。
命令行参数支持如下三种命令行标志语法
-flag 仅支持布尔类型-flag x 仅支持非布尔类型-flagx 均支持
package mainimport (flagfmt
)func main() {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)
}执行
// 均输出 abc
go run main.go -nameabc
go run main.go -nabc子命令实现
在我们日常使用的 CLI 应用中另一个最常见的功能就是子命令的使用一个工具它可能包含大量相关联的功能命令以此形成工具集可以说是刚需那么这个功能在标准库 flag 中可以如何实现呢如下述示例
package mainimport (flaglog
)var name stringfunc main() {flag.Parse()args : flag.Args()if len(args) 0 {return}switch args[0] {case go:goCmd : flag.NewFlagSet(go, flag.ExitOnError)goCmd.StringVar(name, name, Go 语言, 帮助信息)_ goCmd.Parse(args[1:])case php:phpCmd : flag.NewFlagSet(php, flag.ExitOnError)phpCmd.StringVar(name, n, PHP 语言, 帮助信息)_ phpCmd.Parse(args[1:])}log.Printf(name: %s, name)
}在上述代码中我们首先调用了 flag.Parse 方法将命令行解析为定义的标志便于我们后续的参数使用。
另外由于我们需要处理子命令的情况因此我们调用了 flag.NewFlagSet 方法该方法会返回带有指定名称和错误处理属性的空命令集给我们去使用相当于就是创建了一个新的命令集去支持子命令了。
这里需要特别注意的是 flag.NewFlagSet 方法的第二个参数是 ErrorHandling用于指定处理异常错误其内置提供以下三种模式
const (// 返回错误描述ContinueOnError ErrorHandling iota// 调用 os.Exit(2) 退出程序ExitOnError// 调用 panic 语句抛出错误异常PanicOnError
)➜ 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使用 cobra
安装
go get -u github.com/spf13/cobra示例
package mainimport (fmtgithub.com/spf13/cobralog
)func main() {var wordCmd cobra.Command{Use: test, // 子命令的命令标识Short: 测试, // 简短说明Long: 测试 cobra 子命令, // 完整说明Run: func(cmd *cobra.Command, args []string) {fmt.Println(args)},}var rootCmd cobra.Command{}rootCmd.AddCommand(wordCmd)err : rootCmd.Execute()if err ! nil {log.Fatalf(cmd.Execute err: %v, err)}
}在上面的例子中我们添加了一个 test 子命令使用
➜ go run main.go test abc
[abc]这里把 wordCmd 和 rootCmd 都写在一块不是一个好的实践如果命令多的情况下这个文件会非常大。