GO 命令行工具Cobra简单使用

268 阅读2分钟

简介

  • Cobra 是 Go 的 CLI 框架。它包含一个用于创建功能强大的现代 CLI 应用程序的库,以及一个用于快速生成基于 Cobra 的应用程序和命令文件的工具。

需求

  • 在CMD 中使用一些应用时可以通过参数(argument)和标志(flags)进行不同的操作 image.png
  • 我们在执行main文件时也想拥有类似的效果 image.png

使用

导入

import "github.com/spf13/cobra"

RootCmd

  • 通过Command函数获取一个Command 变量
    • Use:单行的使用信息
    • Short:简短描写
    • Long:长描写
    • RunE
      • Run 函数 按下述顺序执行
        • PersistentPreRun()
        • PreRun()
        • Run()
        • PostRun()
        • PersistentPostRun()
      • 所有函数参数args相同,都为命令名
      • 函数名后带E的返回Error
    • Command.Help()用户调用Help命令时为用户提供帮助
var vers bool //全局变量

var RootCmd = &cobra.Command{
	Use: "主commend",
	Short: "主commend的短描写",
	Long: "主commend的长描写",
	RunE: func(cmd *cobra.Command, args []string) error {
		if vers{
			fmt.Println("Cobra v1版本")
			return nil
		}
		return cmd.Help()
	},
}

标志

  • 在初始化时将标志注册
  • PersistentFlags:持久标志,该标志将可用于分配给它的命令以及它的子命令。对于全局标志,将标志分配为Root 上的持久标志。
  • BoolVarP(p *bool, name,shorthand string, value bool, usage string):定义一个Bool类型的Flag
    • p为需要绑定的变量指针
    • name为标志名
    • shorthand为缩写,若不需要可调用BoolVar函数,其他参数相同
    • value为默认值
    • usage为作用
func init(){
	RootCmd.PersistentFlags().BoolVarP(&vers, "version", "v", false, "the root api version")
}

子命令

  • 由于先前定义的vers为持久标志,所以可在子命令中调用-v
  • init函数将StartCmd添加为RootCmd的子命令
var StartCmd = &cobra.Command{
	Use: "start",
	Short: "start API",
	Long:  "启动 API Server",
	RunE: func(cmd *cobra.Command, args []string) error {
		if vers{
			fmt.Println("start version:v1")
		}else{
			fmt.Println("启动 API Server")
		}
		return nil
	},
}

func init(){
	RootCmd.AddCommand(StartCmd)
}

执行

  • Command.Execute():使用args(默认情况下是os.args[1:]),在命令树中运行,找到匹配的命令和相应的标志
func Execute(){
	if err := RootCmd.Execute(); err != nil{
		fmt.Println(err)
		os.Exit(1)
	}
}
  • main函数中调用Execute()

展现

image.png image.png