golang中一个优雅的开发和使用命令行工具的库 cobra

在go语言的命令行工具开发中,我们可以使用go官方的flags来解析用户输入参数实现命令行的开发, 但是如果是有涉及二级命令这类的开发用官方的这个flags就比较麻烦了, 今天给大家介绍一个可用帮助我们快速优雅的开发和使用命令行工具的库cobra, 他可以很轻松的实现二级命令的开发, 还可以帮我们自动生成使用帮助文档, 轻松定义命令执行前后的钩子等。 废话不多说,看示例:

Go 复制代码
package main

import (
	"os"
    "fmt"

	"github.com/spf13/cobra" // 安装依赖 go get -u github.com/spf13/cobra/cobra
)

// 这个是根命令定义
var rootCmd = &cobra.Command{
  Use:   "hugo",// 这个就是你的自己定义的根命令
  Short: "命令的简短说明",
  Long: `这里详细的说明你的命令的作用,更多信息 http://dev.tekin.cn`,
  Run: func(cmd *cobra.Command, args []string) {
    // Do Stuff Here
  },
}

//定义一个参数
var Verbose bool

// 子命令定义 运行方法 go run main.go version 编译后 ./hugo version
var versionCmd = &cobra.Command{
  Use:   "version", // Use这里定义的就是命令的名称
  Short: "Print the version number of Hugo",
  Long:  `All software has versions. This is Hugo's`,
  Run: func(cmd *cobra.Command, args []string) { //这里是命令的执行方法
    fmt.Println("Hugo Static Site Generator v0.9 -- HEAD")
  },
  PreRun: func(cmd *Command, args []string){ 
      //这个在命令执行前执行
  },
  PostRun: func(cmd *Command, args []string){ 
      //这个在命令执行后执行
  },
  // 还有其他钩子函数 
}

// 命令执行方法
func Execute() {
    //给我们定义的命令绑定参数 可以给我们定义的任何命令绑定参数
    rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output")

   //将我们 定义的子命令添加到根命令中 使用方式  ./根命令 子命令
   rootCmd.AddCommand(versionCmd)
   
  // 1表示没有参数 ,设置一个默认的命令,这在你有多个命令,需要再没有任何参数的情况下设置一个默认的命令时非常有用
  if len(os.Args) == 1 { 
	rootCmd.SetArgs([]string{"version"})
  }

  // 执行命令 如果异常会返回错误信息
  if err := rootCmd.Execute(); err != nil {
    fmt.Println(err)
    os.Exit(1)
  }
}

//入口函数
func main() {

	Execute()
}

怎么样,用这个库来开发命令行工具是不是很惬意?

github仓库地址 https://github.com/tekintian/go-cli-cobra

自定义命令Command结构体定义参考

这个里面定义了所有我们可以使用的属性和"方法"(类型为函数的属性)

Go 复制代码
// Command is just that, a command for your application.
// E.g.  'go run ...' - 'run' is the command. Cobra requires
// you to define the usage and description as part of your command
// definition to ensure usability.
type Command struct {
	// Use is the one-line usage message.
	Use string

	// Aliases is an array of aliases that can be used instead of the first word in Use.
	Aliases []string

	// SuggestFor is an array of command names for which this command will be suggested -
	// similar to aliases but only suggests.
	SuggestFor []string

	// Short is the short description shown in the 'help' output.
	Short string

	// Long is the long message shown in the 'help <this-command>' output.
	Long string

	// Example is examples of how to use the command.
	Example string

	// ValidArgs is list of all valid non-flag arguments that are accepted in bash completions
	ValidArgs []string

	// Expected arguments
	Args PositionalArgs

	// ArgAliases is List of aliases for ValidArgs.
	// These are not suggested to the user in the bash completion,
	// but accepted if entered manually.
	ArgAliases []string

	// BashCompletionFunction is custom functions used by the bash autocompletion generator.
	BashCompletionFunction string

	// Deprecated defines, if this command is deprecated and should print this string when used.
	Deprecated string

	// Hidden defines, if this command is hidden and should NOT show up in the list of available commands.
	Hidden bool

	// Annotations are key/value pairs that can be used by applications to identify or
	// group commands.
	Annotations map[string]string

	// Version defines the version for this command. If this value is non-empty and the command does not
	// define a "version" flag, a "version" boolean flag will be added to the command and, if specified,
	// will print content of the "Version" variable.
	Version string

	// The *Run functions are executed in the following order:
	//   * PersistentPreRun()
	//   * PreRun()
	//   * Run()
	//   * PostRun()
	//   * PersistentPostRun()
	// All functions get the same args, the arguments after the command name.
	//
	// PersistentPreRun: children of this command will inherit and execute.
	PersistentPreRun func(cmd *Command, args []string)
	// PersistentPreRunE: PersistentPreRun but returns an error.
	PersistentPreRunE func(cmd *Command, args []string) error
	// PreRun: children of this command will not inherit.
	PreRun func(cmd *Command, args []string)
	// PreRunE: PreRun but returns an error.
	PreRunE func(cmd *Command, args []string) error
	// Run: Typically the actual work function. Most commands will only implement this.
	Run func(cmd *Command, args []string)
	// RunE: Run but returns an error.
	RunE func(cmd *Command, args []string) error
	// PostRun: run after the Run command.
	PostRun func(cmd *Command, args []string)
	// PostRunE: PostRun but returns an error.
	PostRunE func(cmd *Command, args []string) error
	// PersistentPostRun: children of this command will inherit and execute after PostRun.
	PersistentPostRun func(cmd *Command, args []string)
	// PersistentPostRunE: PersistentPostRun but returns an error.
	PersistentPostRunE func(cmd *Command, args []string) error

	// SilenceErrors is an option to quiet errors down stream.
	SilenceErrors bool

	// SilenceUsage is an option to silence usage when an error occurs.
	SilenceUsage bool

	// DisableFlagParsing disables the flag parsing.
	// If this is true all flags will be passed to the command as arguments.
	DisableFlagParsing bool

	// DisableAutoGenTag defines, if gen tag ("Auto generated by spf13/cobra...")
	// will be printed by generating docs for this command.
	DisableAutoGenTag bool

	// DisableFlagsInUseLine will disable the addition of [flags] to the usage
	// line of a command when printing help or generating docs
	DisableFlagsInUseLine bool

	// DisableSuggestions disables the suggestions based on Levenshtein distance
	// that go along with 'unknown command' messages.
	DisableSuggestions bool
	// SuggestionsMinimumDistance defines minimum levenshtein distance to display suggestions.
	// Must be > 0.
	SuggestionsMinimumDistance int

	// TraverseChildren parses flags on all parents before executing child command.
	TraverseChildren bool

	//FParseErrWhitelist flag parse errors to be ignored
	FParseErrWhitelist FParseErrWhitelist

	// commands is the list of commands supported by this program.
	commands []*Command
	// parent is a parent command for this command.
	parent *Command
	// Max lengths of commands' string lengths for use in padding.
	commandsMaxUseLen         int
	commandsMaxCommandPathLen int
	commandsMaxNameLen        int
	// commandsAreSorted defines, if command slice are sorted or not.
	commandsAreSorted bool
	// commandCalledAs is the name or alias value used to call this command.
	commandCalledAs struct {
		name   string
		called bool
	}

	// 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 is command with usage 'help'. If it's not defined by user,
	// cobra uses default help command.
	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
}
相关推荐
空青72617 分钟前
ChatGPT在Java后端开发中的应用与影响
java·开发语言·人工智能·后端·神经网络·机器学习·chatgpt
冯宝宝^28 分钟前
图书管理系统
服务器·数据库·vue.js·spring boot·后端
搁浅小泽30 分钟前
C 语言总复习
c语言·开发语言
五月阳光暖洋洋39 分钟前
SpringBoot2.2.6使用spring-boot-validation读取不到自定义配置文件中的属性
java·开发语言·spring boot
java66666888843 分钟前
深入理解Spring Boot中的容器与依赖注入
java·spring boot·后端
u0104058361 小时前
Spring Boot中的依赖注入和控制反转
java·spring boot·后端
小悟空GK1 小时前
Http介绍
开发语言
虫小宝1 小时前
解决Spring Boot中的安全漏洞与防护策略
java·spring boot·后端
502胶水2051 小时前
腾讯地图异步调用
开发语言·ios·swift
test6382 小时前
使用ThreadLocal存储用户登录信息
java·后端·面试