简介
- Cobra 是 Go 的 CLI 框架。它包含一个用于创建功能强大的现代 CLI 应用程序的库,以及一个用于快速生成基于 Cobra 的应用程序和命令文件的工具。
需求
- 在CMD 中使用一些应用时可以通过参数(argument)和标志(flags)进行不同的操作
- 我们在执行main文件时也想拥有类似的效果
使用
导入
import "github.com/spf13/cobra"
RootCmd
- 通过
Command函数获取一个Command 变量Use:单行的使用信息Short:简短描写Long:长描写RunE:- Run 函数 按下述顺序执行
- PersistentPreRun()
- PreRun()
- Run()
- PostRun()
- PersistentPostRun()
- 所有函数参数args相同,都为命令名
- 函数名后带E的返回Error
- Run 函数 按下述顺序执行
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()
展现