cobra --- 命令行工具库
0. 包 下载
go get github.com/spf13/cobra
go get github.com/spf13/viper # 一般搭配着 viper 配置管理包使用
1. 主命令
命令行项目的入口文件, 用来定义该项目中所有用到的命令及其调用过程
cmd/root.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
// 定义主命令
var rootCmd = &cobra.Command{
Use: "", // 主命令名称, 如 git add . ,这里定义就相当于 git 这个主命令的名字 git
Short: "", // 主命令的简短描述
Long: "", // 主命令的详细描述
Run: func(cmd *cobra.Command, args []string) { // 指定主命令的处理函数
fmt.Println("rootCmd start")
fmt.Println(cmd, args) // args 是所有的子命令数组
fmt.Println("rootCmd end")
},
}
func Execute() {
rootCmd.Execute() // 调用 rootCmd 中的 Run 定义的匿名函数
}
2. main.go
main.go 中调用已经定义好的主命令 rootCmd 中的 Run 定义的匿名函数
main.go
package main
import "example.com/m/v2/cmd"
func main() {
cmd.Execute() // 调用 cobra 定义的命令
}
3. 标志 (flag)
1. 声明规范
cmd/root.go
// 必须在 init 函数中定义执行子命令前的初始化操作、子命令等
func init() {
}
2. 持久化标志
当前命令、子孙命令 都可以使用
1. 布尔类型
cmd/root.go
var isShow bool // 当在命令行使用到该命令后, 会将该命令所携带的标志赋值给 isShow 变量
func init() {
rootCmd.PersistentFlags().Bool("viper", true, "") // 参数为: 标志名 默认值 命令功能描述
rootCmd.PersistentFlags().BoolP("viper", "V", true, "") // 参数为: 标志名 缩写 默认值 命令功能描述
rootCmd.PersistentFlags().BoolVar(&isShow, "viper", true, "") // 参数为: 变量名 标志名 默认值 命令功能描述
rootCmd.PersistentFlags().BoolVarP(&isShow, "viper", "V", true, "") // 参数为: 变量名 标志名 缩写 默认值 命令功能描述
}
2. 字符串类型
cmd/root.go
var cfgFile string // 当在命令行使用到该命令后, 会将该命令所携带的标志赋值给 cfgFile 变量
func init() {
rootCmd.PersistentFlags().String("config", "", "global config for project") // 参数为: 标志名 默认值 命令功能描述
rootCmd.PersistentFlags().StringP("config", "C", "", "global config for project") // 参数为: 标志名 缩写 默认值 命令功能描述
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "global config for project") // 参数为: 变量名 标志名 默认值 命令功能描述
rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "C", "", "global config for project") // 参数为: 变量名 标志名 缩写 默认值 命令功能描述
}
3. 本地标志
只允许当前命令使用
1. 布尔类型
cmd/root.go
var isShow bool // 当在命令行使用到该命令后, 会将该命令所携带的标志赋值给 isShow 变量
func init() {
rootCmd.Flags().Bool("viper", true, "") // 参数为: 标志名 默认值 命令功能描述
rootCmd.Flags().BoolP("viper", "V", true, "") // 参数为: 标志名 缩写 默认值 命令功能描述
rootCmd.Flags().BoolVar(&isShow, "viper", true, "") // 参数为: 变量名 标志名 默认值 命令功能描述
rootCmd.Flags().BoolVarP(&isShow, "viper", "V", true, "") // 参数为: 变量名 标志名 缩写 默认值 命令功能描述
}
2. 字符串类型
cmd/root.go
var cfgFile string // 当在命令行使用到该命令后, 会将该命令所携带的标志赋值给 cfgFile 变量
func init() {
rootCmd.Flags().String("config", "", "global config for project") // 参数为: 标志名 默认值 命令功能描述
rootCmd.Flags().StringP("config", "C", "", "global config for project") // 参数为: 标志名 缩写 默认值 命令功能描述
rootCmd.Flags().StringVar(&cfgFile, "config", "", "global config for project") // 参数为: 变量名 标志名 默认值 命令功能描述
rootCmd.Flags().StringVarP(&cfgFile, "config", "C", "", "global config for project") // 参数为: 变量名 标志名 缩写 默认值 命令功能描述
}
4. 全局标志
根命令的持久化标志, 所有命令都能使用
4. 命令绑定配置文件
1. 根据命令行指定读取配置文件
cmd/root.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"os"
"strings"
)
var (
cfgFile string
rootCmd = &cobra.Command{
Use: "", // 主命令名称, 如 git add . ,这里定义就相当于 git 这个主命令的名字 git
Short: "", // 主命令的简短描述
Long: "", // 主命令的详细描述
Run: func(cmd *cobra.Command, args []string) { // 指定主命令的处理函数
fmt.Println("rootCmd start")
fmt.Println(cmd.Flags().Lookup("viper").Value) // 从所有 本地标志 中找到名字为 viper 的值
fmt.Println(cmd.PersistentFlags().Lookup("config").Value) // 从所有 持久化标志 中找到名字为 config 的值
fmt.Println("rootCmd end")
},
}
)
func Execute() {
rootCmd.Execute() // Execute 调用主命令的 Run 定义的匿名函数
}
// init 函数中定义执行子命令前的初始化操作、子命令等
func init() {
cobra.OnInitialize(initConfig) // 在所有的子命令执行前, 先初始化配置文件
rootCmd.PersistentFlags().Bool("viper", true, "")
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "c", "global config for project")
}
// initConfig 配置文件的初始化操作
func initConfig() {
if strings.TrimSpace(cfgFile) != "" {
viper.SetConfigFile(cfgFile) // 设置配置文件的读取目录
} else {
home, err := os.UserHomeDir()
cobra.CheckErr(err)
viper.AddConfigPath(home) // 添加 viper 读取配置文件的目录
viper.SetConfigType("yaml") // 指定读取配置文件的格式为 yaml
viper.SetConfigName(".cobra") // 指定配置文件的名字
}
viper.AutomaticEnv() // 检查环境变量, 将配置的键值对加载到 viper 中进行管理
if err := viper.ReadInConfig(); err != nil {
fmt.Println("读取配置文件失败")
return
}
fmt.Println("读取配置文件成功, 已经使用的配置文件为: ", viper.ConfigFileUsed())
}
2. 命令行执行命令
go run main.go --viper=true --config="myconf.yaml"
go run main.go --viper=true -C "myconf.yaml"
3. 命令行参数绑定配置对象
目的是为了读取配置文件中的配置项, 然后根据配置文件的配置替换 viper 中对应的配置项
cmd/root.go
var (
cfgFile string
rootCmd = &cobra.Command{
Use: "", // 主命令名称, 如 git add . ,这里定义就相当于 git 这个主命令的名字 git
Short: "", // 主命令的简短描述
Long: "", // 主命令的详细描述
Run: func(cmd *cobra.Command, args []string) {
// 获取配置对象中的 author
author := viper.GetString("author")
fmt.Println(author)
},
}
)
// init 函数中定义执行子命令前的初始化操作、子命令等
func init() {
rootCmd.PersistentFlags().StringP("author", "A", "", "")
// 将命令行的 author 参数绑定到配置对象
viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author")) // 绑定配置对象
viper.SetDefault("author", "xiaoming") // 设置默认值
}
python防脱发技巧

浙公网安备 33010602011771号