打工还是要打工的。。我最后也没发出去。

紧急处理以后,现在写复盘,大家随我看看我到底是在学习哪些内容。

(以上内容纯属虚构,如有雷同纯属巧合)

简介

cobra
KubernetesHugoetcdcobra
spf13spf13vimspf13-vim

viperJSON/TOML/YAML/HCL/envfile/Java propertieshugo

快速使用

cobra
$ go get github.com/spf13/cobra/cobra
复制代码
golang.org/x/text
gitgit version
get-started/
    cmd/       
      root.go        
      version.go    
    utils/
      helper.go
    main.go
复制代码
cmdversionroot.gomain.gohelpergo.mod
import "github.com/spf13/cobra"version.go
var versionCmd = &cobra.Command{
	Use:   "version",
	Short: "version subcommand show git version info.",

	Run: func(cmd *cobra.Command, args []string) {
		output, err := utils.ExecuteCommand("git", "version", args...)
		if err != nil {
			utils.Error(cmd, args, err)
		}

		fmt.Fprint(os.Stdout, output)
	},
}

func init() {
	rootCmd.AddCommand(versionCmd)
}
复制代码
init()
rootCmdroot.go
var rootCmd = &cobra.Command {
	Use: "git",
	Short: "Git is a distributed version control system.",
	Long: `Git is a free ...省略`,
	Run: func(cmd *cobra.Command, args []string) {
		utils.Error(cmd, args, errors.New("unrecognized command"))
	},
}

func Execute() {
	rootCmd.Execute()
}
复制代码
init()Execute()main.go
import "cmd"
func main() {
  cmd.Execute()
}
复制代码
helpers.go
cobravery cool
$ go run . -h
Git is a free and open source distributed version control system
designed to handle everything from small to very large projects 
with speed and efficiency.

Usage:
  git [flags]
  git [command]

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  version     version subcommand show git version info.

Flags:
  -h, --help   help for git

Use "git [command] --help" for more information about a command.

复制代码

单个子命令的帮助信息:

$ go run . version -h
version subcommand show git version info.

Usage:
  git version [flags]

Flags:
  -h, --help   help for version
复制代码

调用子命令:

$ go run . version
git version 2.33.0
复制代码

未识别的子命令:

$ go run . xxx
Error: unknown command "xxx" for "git"
Run 'git --help' for usage.
复制代码
cobra
appName/
    cmd/
        cmd1.go
        cmd2.go
        cmd3.go
        root.go
    main.go
复制代码
cmdmain.go

特性

cobra 提供非常丰富的功能:

app serverapp fetch

首先需要明确 3 个基本概念:

  • 命令(Command):就是需要执行的操作;
  • 参数(Arg):命令的参数,即要操作的对象;
  • 选项(Flag):命令选项可以调整命令的行为。

比如

git clone URL --bare
复制代码
cloneURL--bare

参数

比如定义命令的地方。

var cloneCmd = &cobra.Command{
	Use:   "clone url [destination]",
  ...
  Run: func(cmd *cobra.Command, args []string) {
  ...
复制代码

会改变帮助函数输出的内容。实际上还是传入字符串数组。

go run . clone -h
Clone a repository into a new directory

Usage:
  git clone url [destination] [flags]

Flags:
  -h, --help   help for clone
复制代码

选项

cobra
PersistentFlags
cobrapflag
root.goinit()
var(
  Verbose bool
)
func init() {
  rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output")
}

复制代码
init()
var(
  Source bool
)
func init() {
  localCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from")
  rootCmd.AddCommand(divideCmd)
}
复制代码

两种参数都是相同的,长选项/短选项名、默认值和帮助信息。

脚手架

cobra
go rootcobra-clibinpath
go install github.com/spf13/cobra-cli@latest
复制代码

下面我们介绍如何使用这个生成器,先看命令帮助:

Usage:
  cobra-cli init [path] [flags]

Aliases:
  init, initialize, initialise, create

Flags:
  -h, --help   help for init

Global Flags:
  -a, --author string    author name for copyright attribution (default "YOUR NAME")
      --config string    config file (default is $HOME/.cobra.yaml)
  -l, --license string   name of license for the project
      --viper            use Viper for configuration
复制代码
initpath-a--config stringcobra-cli-llicense--viperviper
cobra init
$ mkdir appname
$ cd appname
$ cobra-cli init
Error: Please run `go mod init <MODNAME>` before `cobra-cli init`
$ go mod init
go: creating new go.mod: module github.com/golang-minibear2333/cmd_utils/git/appname
$ cobra-cli init
Your Cobra application is ready at
/Users/xxxx/Documents/code/go/src/github.com/golang-minibear2333/cmd_utils/git/appname
复制代码
modappname
.
├── LICENSE
├── cmd
│   └── root.go
├── go.mod
├── go.sum
└── main.go
复制代码
cobramain.go

配置读取

除了命令行以外,这个库还可以用来配置读取,我们先创建项目和配置文件:

mkdir cfg_load && cd_cg_load
mkdir config && touch config/cfg.yaml
cat >config/cfg.yaml <<-EOF
people:
   name: minibear2333
   age: 18
EOF
复制代码
linuxGo

现在我们尝试读取这个配置文件,直接使用命令来创建读取配置文件的代码。

$ cobra-cli init --viper
Your Cobra application is ready at
/Users/xxx/Documents/code/go/src/github.com/golang-minibear2333/cmd_utils/git/cfg_load
复制代码
$HOME/.cfg_load.yaml
$ go run . --config==config/cfg.yaml
复制代码
viper
cobra-cli
$ cobra-cli add viperall
复制代码
Run
var viperallCmd = &cobra.Command{
	Use:   "viperall",
	Short: "Show cfg all",
	Long: `Show the contents of the entire configuration file`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println(viper.AllSettings())
	},
}
复制代码

运行,妥了。

$ go run . viperall --config=config/cfg.yaml 
Using config file: config/cfg.yaml
map[people:map[age:18 name:minibear2333]]
复制代码
viperpr
init()
$ cobra-cli add tt -p viperallCmd
tt created at /Users/xxx/Documents/code/go/src/github.com/golang-minibear2333/cmd_utils/git/cfg_load
$ go run . viperall tt --config=config/cfg.yaml 
Using config file: config/cfg.yaml
tt called
复制代码
viperall-pviperallCmd
var viperallCmd = &cobra.Command{
复制代码

小结

version.goinitcobra-cli

推荐目录结构

.
├── LICENSE
├── cmd
│   ├── root.go
|   ├── cmd1.go
├── go.mod
├── go.sum
└── main.go
复制代码
cobra
  • 设置钩子函数,在命令执行前、后执行某些操作。
  • 生成 Markdown/ReStructed Text/Man Page 格式的文档。
  • 等。自己下来学咯。
cobracobracobra

一起进步

可掘金私信我,也可 加我好友 我们一起进步