cobra - 更容易地构建命令行应用

简介: cobra - 更容易地构建命令行应用

cobra 是什么

cobra 的主要功能是创建强大的现代 cli 应用程序。目前市面上许多的著名的 Go 语言开源项目都是使用 Cobra 来构建的,例如:K8s、Hugo、etcd、Docker 等,是非常可靠的一个开源项目。

没有 cobra 之前用什么

如果不用 cobra,我们也可以使用 go 自带的 flag 标准库

flag 的基本用法

下面代码中,我们调用标准库 flagStringVar 方法实现了对命令行参数 name 的解析和绑定,其各个形参的含义分别为命令行标识位的名称、默认值、帮助信息。

命令行参数支持如下三种命令行标志语法:

  • -flag 仅支持布尔类型
  • -flag x 仅支持非布尔类型
  • -flag=x 均支持
package main
import (
  "flag"
  "fmt"
)
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 -name=abc
go run main.go -n=abc

子命令实现

在我们日常使用的 CLI 应用中,另一个最常见的功能就是子命令的使用,一个工具它可能包含大量相关联的功能命令以此形成工具集,可以说是刚需,那么这个功能在标准库 flag 中可以如何实现呢,如下述示例:

package main
import (
  "flag"
  "log"
)
var name string
func 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 main
import (
  "fmt"
  "github.com/spf13/cobra"
  "log"
)
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]

这里把 wordCmdrootCmd 都写在一块不是一个好的实践,如果命令多的情况下,这个文件会非常大。


目录
相关文章
|
6月前
|
测试技术
如何用命令行执行cypress?
如何用命令行执行cypress?
112 0
|
JSON Kubernetes 算法
Cobra 命令自动补全指北
本篇文章就来讲讲如何使用 Cobra 来实现命令自动补全。
3593 0
|
3月前
|
Shell 开发工具 git
使用 Shell 代码简化 Git 步骤
【8月更文挑战第23天】本文介绍通过Shell脚本简化Git操作的方法:1) 使用`gitc "提交信息"`可一键完成代码提交与推送至远程仓库;2) 执行`gitpull`即可从远程仓库拉取最新代码并合并到当前分支;3) 输入`gitnewbranch 分支名称`快速创建并切换到新分支。将这些自定义函数加入`.bashrc`或`.zshrc`等配置文件后,即可随时调用简化版Git命令。
|
4月前
|
Python
`cmd`模块是Python标准库中的一个模块,它提供了一个简单的框架来创建命令行解释器。
`cmd`模块是Python标准库中的一个模块,它提供了一个简单的框架来创建命令行解释器。
|
6月前
|
Shell Linux Go
酷玩Go命令行工具—Cobra
酷玩Go命令行工具—Cobra
88 0
|
12月前
|
存储 JSON Go
Go 命令行框架: 构建强大的命令行工具
Go 命令行框架: 构建强大的命令行工具
|
Kubernetes NoSQL Go
Go 优秀库推荐 - 命令行工具 cobra
spf13/cobra 和 urfave/cli 是Go的2个优秀命令行工具:
743 0
Go 优秀库推荐 - 命令行工具 cobra
|
存储 Go
Go 命令行参数解析工具 pflag 使用
Go 命令行参数解析工具 pflag 使用
396 0
|
Kubernetes Unix Shell
Go 语言现代命令行框架 Cobra 详解
Go 语言现代命令行框架 Cobra 详解
1204 0