打工还是要打工的。。我最后也没发出去。
紧急处理以后,现在写复盘,大家随我看看我到底是在学习哪些内容。
(以上内容纯属虚构,如有雷同纯属巧合)
简介
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
一起进步
可掘金私信我,也可 加我好友 我们一起进步