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号