预先准备: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