基本上所有命令相关的功能都定义在Command结构体中
type Command struct {
// Use 表示用一句话来描述这个命令作用,这段话的第一个单词会被作为这个命令的名称
// 这个设置在子命令中生效,对于根命令则没有意义
Use string
// Alias 可以用来给子命令定义别名,除了使用 Use 中的第一个单词作为子命令外,你还可以使用这个 Alias
// 里面定义的任何一个名称作为子命令名称
Aliases []string
// SuggestFor 定义一组提示命令,当输入匹配其中任何一个命令的时候,会提示是否希望输入的为 echo 命令
SuggestFor []string
// Short 是用来在帮助信息位置显示的简短命令帮助
Short string
// Long 是用来在使用命令 'help <this-command>' 显示帮助信息时显示的长文字
Long string
// Example 用来定义子命令使用的具体示例,可以在里面定义多行不同的命令使用样例,供用户参考,这一点在
// Kubectl 命令中体现的非常明显,因为 Kubectl 命令很复杂,参数也很多,所有样例会极大方便用户
Example string
// ValidArgs 是一组可用在 Bash 补全中的合法的非选项参数
ValidArgs []string
// ValidArgsFunction is an optional function that provides valid non-flag arguments for shell completion.
// It is a dynamic version of using ValidArgs.
// Only one of ValidArgs and ValidArgsFunction can be used for a command.
ValidArgsFunction func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective)
// Args 表示期望的参数
Args PositionalArgs
// ArgAliases 是 ValidArgs 的一组别名
// 这些参数不会在 Bash 补全中提示给用户,但是如果手动输入的话,也是允许的
ArgAliases []string
// BashCompletionFunction 是 Bash 自动补全生成器使用的自定义函数
BashCompletionFunction string
// Deprecated 不为空的时候,在命令执行时都会提示命令已废弃,并且输出这段文字
Deprecated string
// Annotations 定义一些键值对,应用可以用这些注解来分组命令,主要用于标注上面的分组
Annotations map[string]string
// Version 定义这个命令的版本。当 Version 值不为空,且命令没有定义 version 选项的时候,会自动给这个命令增加一个
// boolean 类型,名称为 version 的选项。如果指定这个选项,就会输出这里 Version 的值。
Version string
// 下面的这组 Run 函数执行顺序为:
// * PersistentPreRun()
// * PreRun()
// * Run()
// * PostRun()
// * PersistentPostRun()
// 所有的函数传入的参数都相同,都是命令名称之后的参数
//
// PersistentPreRun 这个命令的子命令都将继承并执行这个函数
PersistentPreRun func(cmd *Command, args []string)
// PersistentPreRunE 和 PersistentPreRun 一样,但是遇到错误时可以返回一个错误
// 一旦这个函数返回的 error 不为 nil,那么执行就中断了。所以你可以在这个函数里面
// 做诸如权限验证等等全局性的工作
PersistentPreRunE func(cmd *Command, args []string) error
// PreRun 这个命令的子命令不会继承和运行这个函数
PreRun func(cmd *Command, args []string)
// PreRunE 和 PreRun 一样,但是遇到错误时可以返回一个错误
// 一旦这个函数返回的 error 不为 nil,那么执行就中断了。所以你可以在这个函数里面
// 做一些和该命令相关的输入参数检测之类的工作
PreRunE func(cmd *Command, args []string) error
// Run 命令核心工作所在的函数,大多数情况下只实现这个命令即可
Run func(cmd *Command, args []string)
// RunE 和 Run 一样,但是遇到错误时可以返回一个错误
// 一旦这个函数返回的 error 不为 nil,那么执行就中断了。
RunE func(cmd *Command, args []string) error
// PostRun 在 Run 函数执行之后执行
PostRun func(cmd *Command, args []string)
// PostRunE 在 PostRun 之后执行,但是可以返回一个错误
// 一旦这个函数返回的 error 不为 nil,那么执行就中断了。
PostRunE func(cmd *Command, args []string) error
// PersistentPostRun 在 PostRun 之后执行,这个命令的子命令都将继承并执行这个函数
PersistentPostRun func(cmd *Command, args []string)
// PersistentPostRunE 和 PersistentPostRun 一样,但是可以返回一个错误
// 一旦这个函数返回的 error 不为 nil,那么执行就中断了。
PersistentPostRunE func(cmd *Command, args []string) error
// args is actual args parsed from flags.
args []string
// flagErrorBuf contains all error messages from pflag.
flagErrorBuf *bytes.Buffer
// flags is full set of flags.
flags *flag.FlagSet
// pflags contains persistent flags.
pflags *flag.FlagSet
// lflags contains local flags.
lflags *flag.FlagSet
// iflags contains inherited flags.
iflags *flag.FlagSet
// parentsPflags is all persistent flags of cmd's parents.
parentsPflags *flag.FlagSet
// globNormFunc is the global normalization function
// that we can use on every pflag set and children commands
globNormFunc func(f *flag.FlagSet, name string) flag.NormalizedName
// usageFunc is usage func defined by user.
usageFunc func(*Command) error
// usageTemplate is usage template defined by user.
usageTemplate string
// flagErrorFunc is func defined by user and it's called when the parsing of
// flags returns an error.
flagErrorFunc func(*Command, error) error
// helpTemplate is help template defined by user.
helpTemplate string
// helpFunc is help func defined by user.
helpFunc func(*Command, []string)
//helpCommand “help”的命令。不自定义使用默认
helpCommand *Command
// versionTemplate is the version template defined by user.
versionTemplate string
// inReader is a reader defined by the user that replaces stdin
inReader io.Reader
// outWriter is a writer defined by the user that replaces stdout
outWriter io.Writer
// errWriter is a writer defined by the user that replaces stderr
errWriter io.Writer
//FParseErrWhitelist 定义可以被忽略的解析错误
FParseErrWhitelist FParseErrWhitelist
// CompletionOptions is a set of options to control the handling of shell completion
CompletionOptions CompletionOptions
// commandsAreSorted defines, if command slice are sorted or not.
commandsAreSorted bool
// commandCalledAs 用于调用此命令的名称或别名值。
commandCalledAs struct {
name string
called bool
}
ctx context.Context
//commands 支持的命令列表。
commands []*Command
// parent是此命令的父命令。
parent *Command
// Max lengths of commands' string lengths for use in padding.
commandsMaxUseLen int
commandsMaxCommandPathLen int
commandsMaxNameLen int
// TraverseChildren 在执行该命令子命令前,解析所有父命令的选项
TraverseChildren bool
// Hidden 参数设置为 true 的时候,将无法在命令帮助列表中看到这个命令,但是实际这个命令仍然是可用的,一般用于
// 对命令做向下兼容的处理,在未来的版本中如果这个命令会废弃,那么先让它隐藏起来会比直接删除较好
Hidden bool
// SilenceErrors 设置为 true 时可以在命令执行过程中遇到任何错误时,不显示错误
SilenceErrors bool
// SilenceUsage 设置为 true 时可以在命令执行遇到输入错误时,不显示使用方法
SilenceUsage bool
// DisableFlagParsing 设置为 true 时将禁用选项解析功能,这样命令之后所有的内容
DisableFlagParsing bool
// DisableAutoGenTag 在生成命令文档的时候是否显示 gen tag
DisableAutoGenTag bool
// DisableFlagsInUseLine 设置为 true 的时候,将不会在命令帮助信息或者文档中显示命令支持的选项
DisableFlagsInUseLine bool
// DisableSuggestions 禁用命令提示
DisableSuggestions bool
// SuggestionsMinimumDistance 定义显示命令提示的最小的 Levenshtein 距离
SuggestionsMinimumDistance int
小例子
echo.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
// testCmd represents the test command
var echoCmd = cobra.Command{
// 子命令描述,第一个单词作为子命令名称
Use: "echo",
// 子命令别名,可以使用任何一个别名替代上面的 echo 来运行子命令
Aliases: []string{
"copy",
"repeat",
},
// 命令提示,默认情况如果输入的子命令不存在会提示 unknown cmd,
// 但是如果定义了 SuggestFor 的情况下,如果输入的命令不存在,会去 SuggestFor
// 里面查找是否有匹配的字符串,如果有,则提示是否期望输入的是 echo 命令
SuggestFor: []string{
"ech", "cp", "rp",
},
DisableSuggestions: true,
SuggestionsMinimumDistance: 2,
DisableFlagsInUseLine: true,
// 简单扼要概括下命令的用途
Short: "echo is a command to echo command line inputs",
// 想说什么都在这里说吧,越详细越好,可以使用 `` 来跨行输入
Long: `echo is a command to echo command line inputs.
It is a very simple command used to display how to implement command line tools
using cobra, which is a very famous library to build command line interface tools.
`,
// 新版本废弃时隐藏,但是实际是可以执行的
//Hidden: true,
// 废弃说明
//Deprecated: "will be deleted in version 2.0",
// 注解,用于代码层面的命令分组,不会显示在命令行输出中
Annotations: map[string]string{
"group": "user",
"require-auth": "none",
},
SilenceErrors: true,
//SilenceUsage: true,
// Version 定义版本
Version: "1.0.0",
// 是否禁用选项解析
//DisableFlagParsing: true,
//DisableAutoGenTag: true,
// PersistentPreRun: func(cmd *cobra.Command, args []string) {
// fmt.Println("let me check echk")
// },
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
// return errors.New("invalid parameter")
return nil
},
// 子命令执行过程
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Run")
},
RunE: func(cmd *cobra.Command, args []string) error {
fmt.Println("RunE")
return nil
},
PostRun: func(cmd *cobra.Command, args []string) {
fmt.Println("PostRun")
},
}
func init() {
rootCmd.AddCommand(&echoCmd)
}
版权声明:本文为Meyerheim1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。