go cobra

本文介绍了 Golang 包 Cobra,它可创建命令行程序,也能生成应用框架。阐述了其主要功能,如简易子命令行模式、自动生成帮助信息等,讲解了 commands、arguments 和 flags 等主要概念,还介绍了安装、使用方法、命令行参数及验证方法,并给出了项目结构和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 概述

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 执行程序
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值