当前位置: 首页 > 工具软件 > go-callvis > 使用案例 >

go语言cli命令行交互

计阳泽
2023-12-01
  • cobra使用

预先准备:go get “github.com/spf13/cobra”

cobra/cmd/root.go

package cmd

import (
	"fmt"
	"os"
	"github.com/spf13/cobra"
	"github.com/spf13/viper"
	homedir "github.com/mitchellh/go-homedir"
)

var RootCmd = &cobra.Command{
	Use:     "query",
	Short:   "query student info",
	Long: "运行main会生成query.exe文件",
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Printf("\n-- start running cli --\n")
	},
}

// 执行RootCmd命令,在main被调用
func Execute()  {
	RootCmd.Execute()
}

var cfgFile string

func init() {
	// 在此可以定义自己的flag或者config设置
	cobra.OnInitialize(initConfig)
	
	// Cobra支持持久标签(persistent flag),它对于整个应用为全局
	RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (defalut in $HOME/.cobra.yaml)")

	// Cobra同样支持局部标签(local flag),并只在直接调用它时运行
	RootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

func initConfig() {
	// 从命令行获取不到配置文件就去homedir下读取
	if cfgFile != "" {
		viper.SetConfigName(cfgFile)
	} else {
		// 找到home文件
		home, err := homedir.Dir()
		if err != nil {
			fmt.Println(err)
			os.Exit(1)
		}

		// 在home文件夹中搜索以“.yaml”为名称的config --config=query.yaml
		viper.AddConfigPath(home)
		viper.SetConfigName(".yaml")
	}
	// 读取符合的环境变量
	viper.AutomaticEnv()

	if err := viper.ReadInConfig(); err != nil {
		fmt.Println("Can not read config:", viper.ConfigFileUsed())
	}
}

cobra/cmd/show.go

// Use代表显示的关键字show
//ValidArgs代表use后添加的关键字 show items,show datas
//Args判断show后面的关键字只能是ValidArgs,若不是就报错

var ShowCmd = &cobra.Command{
	Use:     "show",
	Short:   "show items",
	ValidArgs: []string{"items", "datas"},
	Args:cobra.OnlyValidArgs,
	Run: func(cmd *cobra.Command, args []string) {
		if len(args) == 0{
			cmd.Help()
			return
		}
	},
}

// init先调用ShowCmd然后调用ItemsCmd,在命令行可以通过关键字show items调用
func init(){
	RootCmd.AddCommand(ShowCmd)
	ShowCmd.AddCommand(ItemsCmd)
}

cobra/cmd/items.go

var ItemsCmd= &cobra.Command{
	Use:     "items",
	Short:   "show items",
	Run: func(cmd *cobra.Command, args []string) {
		err := showItems(cmd, args)
		if err != nil{
			fmt.Printf("\n-- show items error:%v --\n", err)

			}
		}
	},
}

var (
	name string
	age string
	hobby []string
)

func init(){
	//StringVar第一个参数是获取命令行输入
	//第二个参数是name
	//第三个参数是value默认值
	//第四个参数是描述
	ItemsCmd.Flags().StringVar(&name, "name", "amber", "name of student")
	
	// 在StringVarP中需要增加第3个参数`shorthand`,--name也可以--n
	ItemsCmd.Flags().StringVarP(&name, "name", "n", "amber", "name of student")
	
	ItemsCmd.Flags().Int32Var(&age, "age", "a", 0, "age of student")
	
	//StringSliceVar接收多个string类型数组,--hobby="sing,dance"
	ItemsCmd.Flags().StringSliceVar(&hobby, "hobby", nil, "hobby of student")
}

func showItems(cmd *cobra.Command, args []string) error {
	// 若在命令行获取不到,就去配置文件找
	if len(name) == 0{
		name= viper.GetString("name")
	}
	if len(age) == 0{
		name= viper.GetInt32("age")
	}
	if len(hobby) == 0{
		hobby = viper.GetStringSlice("hobby")
	}
	fmt.Printf("name :%v --\n", name)
	fmt.Printf("age :%v --\n", age)
	fmt.Printf("hobby :%v --\n", hobby)
}

cobra/main.go

import "./cmd"

func main() {
	cmd.Execute()
}

cobra/query.json

{
	"name":"amber",
	"age": 18,
	"hobby": "dance, sing"
}
  • 命令行使用:
    ./query show items --name=amber --age=18 --hobby=“dance,sing”
    ./query show items --config=query.yaml

  • 输出结果
    name : amber
    age : 18
    hobby : dance,sing

 类似资料: