一 概述
Cobra 是一个 Golang 包,它提供了简单的接口来创建命令行程序。同时,Cobra 也是一个应用程序,用来生成应用框架,从而开发以 Cobra 为基础的应用。
二 主要功能
- 简易的子命令行模式,如 app server, app fetch 等等
- 完全兼容 posix 命令行模式
- 嵌套子命令 subcommand
- 支持全局,局部,串联 flags
- 使用 cobra 很容易的生成应用程序和命令,使用 cobra create appname 和 cobra add cmdname
- 如果命令输入错误,将提供智能建议,如 app srver,将提示 srver 没有,是不是 app server
- 自动生成 commands 和 flags 的帮助信息
- 自动生成详细的 help 信息,如 app help
- 自动识别帮助 flag -h,–help
- 自动生成应用程序在 bash 下命令自动完成功能
- 自动生成应用程序的 man 手册
- 命令行别名
- 自定义 help 和 usage 信息
- 可选的与 viper apps 的紧密集成
三 主要概念
Cobra有三个基本概念commands,arguments和flags。其中commands代表行为,arguments代表数值,flags代表对行为的改变。
执行命令行程序时的一般格式为:
APPNAME COMMAND ARG --FLAG
比如下面的例子
# server是 commands,port 是 flag
hugo server --port=1313
# clone 是 commands,URL 是 arguments,brae 是 flag
git clone URL --bare
四 安装
go get -v github.com/spf13/cobra/cobra
备注: 如果出现下面错误,则执行后面命令
package golang.org/x/text/transform: unrecognized import path "golang.org/x/text/transform": https fetch: Get "https://golang.org/x/text/transform?go-get=1": dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
package golang.org/x/text/unicode/norm: unrecognized import path "golang.org/x/text/unicode/norm": https fetch: Get "https://golang.org/x/text/unicode/norm?go-get=1": dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
// 1 进入gopath路径下面cd $GOPATH/src/golang.org/x目录,如果不存在自己创建
cd $GOPATH/src/golang.org/x
// 2 下载sys
git clone https://github.com/golang/sys
// 下载text
git clone https://github.com/golang/text
// 安装 cobra
go get -v github.com/spf13/cobra/cobra
五 使用
1 cobra命令方式
// 1 创建项目目录
mkdir appname
// 初始化
cd appname
cobra init --pkg-name appname
// 增加command
cobra add test1
cobra add test2
2 直接添加代码
可以不用cobra命令, 在项目中直接增加相关代码, 例子中就是直接增加的
六 命令行参数
- 首先我们来搞清楚命令行参数(arguments)与命令行选项的区别(flags/options)。以常见的 ls 命令来说,其命令行的格式为:ls [OPTION]… [FILE]…
- 其中的 OPTION 对应本文中介绍的 flags,以 - 或 – 开头;而 FILE 则被称为参数(arguments)或位置参数。一般的规则是参数在所有选项的后面,上面的 … 表示可以指定多个选项和多个参数。
- cobra 默认提供了一些验证方法:
NoArgs - 如果存在任何位置参数,该命令将报错
ArbitraryArgs - 该命令会接受任何位置参数
OnlyValidArgs - 如果有任何位置参数不在命令的 ValidArgs 字段中,该命令将报错
MinimumNArgs(int) - 至少要有 N 个位置参数,否则报错
MaximumNArgs(int) - 如果位置参数超过 N 个将报错
ExactArgs(int) - 必须有 N 个位置参数,否则报错
ExactValidArgs(int) 必须有 N 个位置参数,且都在命令的 ValidArgs 字段中,否则报错
RangeArgs(min, max) - 如果位置参数的个数不在区间 min 和 max 之中,报错
七 举例
1 项目构体
2 代码
main.go
package main
import (
"test_cobra/cmd"
)
func main() {
cmd.Execute()
}
root.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
Use: "test_cobra",
Short: "test cobra demo",
Long: `test cobra for future use`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("unrecognized command")
},
}
func Execute() {
rootCmd.Execute()
}
version.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var versionCmd = &cobra.Command{
Use: "version",
Short: "version subcommand show version info.",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("version 1.0.1")
},
}
func init() {
rootCmd.AddCommand(versionCmd)
}
comcmd.go
package cmd
import (
"errors"
"fmt"
"github.com/spf13/cobra"
)
var g_times int
var commonCmd = &cobra.Command{
Use: "comcmd",
Short: "common cmd",
Long: `common cmd for test child cmd`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("parent cmd")
},
}
var childCmd = &cobra.Command{
Use: "childcmd",
Short: "child cmd",
Long: `child cmd for test child cmd`,
Args: func(cmd *cobra.Command, args []string) error {
if len(args) < 1 {
return errors.New("requires at least one arguments")
}
return nil
},
Run: func(cmd *cobra.Command, args []string) {
for i := 0; i < g_times; i++ {
fmt.Println("child cmd ", args[0])
}
},
}
func init() {
rootCmd.AddCommand(commonCmd)
// test flag
childCmd.Flags().IntVarP(&g_times, "times", "t", 1, "times to echo the input")
commonCmd.AddCommand(childCmd)
}
** 结果:**
-
1 执行程序help
-
2 执行程序子命令help
-
3 执行程序