zl程序教程

您现在的位置是:首页 >  其他

当前栏目

go cobra CLI工具库的简单入门

2023-02-25 18:22:19 时间

下载:go install github.com/spf13/cobra-cli@latest

执行init创建一个初始项目:cobra-cli init

发现多了个cmd/root.gomain.go

我们这里先不看root.go,先添加一个可用命令test。cobra-cli add test

把默认的注释去掉后,然后添加获取输入的参数。

 package cmd
 ​
 import (
     "fmt"
 ​
     "github.com/spf13/cobra"
 )
 ​
 var testCmd = &cobra.Command{
     Use:   "test",
     Short: "我是test命令的简要描述",
     Long:  `我是test命令的长描述,我负责测试。可以把你输入的参数进行输出。`,
     Run: func(cmd *cobra.Command, args []string) {
         fmt.Println("我是test,我被调用了")
         //获取test命令的输入,这里必须是长命令test,而不能是短命令t
         getString, err := cmd.PersistentFlags().GetString("test")
         if err != nil {
             fmt.Println(err)
         } else {
             fmt.Printf("我成功拿到了%s命令", getString)
         }
     },
 }
 ​
 func init() {
     rootCmd.AddCommand(testCmd)
     //添加长命令test和短命令t,需要注意的是短命令这里只能是单个字符
     //StringP("长命令", "短命令", "默认值", "参数描述")
     testCmd.PersistentFlags().StringP("test", "t", "", "我是全局测试")
 }

go build之后运行当前目录下的生成的exe程序,exe程序和项目名一致。

直接运行,不带参数,可以发现我们自己添加进去的test命令和其对应的简要描述。

运行test命令,查看其help。发现test的长描述,说明了test的功能是负责把用户的输入进行输出。并且输入的参数名是-t或者是--test

因此我们可以输入test -t [参数值]或者test --test [参数值]来输出用户的输入。

我们还可以进行命令的嵌套,比如这里在上面的test.go文件下面写多一个test2命令

 package cmd
 ​
 import (
    "fmt"
 ​
    "github.com/spf13/cobra"
 )
 ​
 var testCmd1 = &cobra.Command{
    Use:   "test1",
    Short: "我是test1命令的简要描述",
    Long:  `我是test1命令的长描述,我负责测试。可以把你输入的参数进行输出。`,
    Run: func(cmd *cobra.Command, args []string) {
       fmt.Println("我是test1,我被调用了")
       //获取test参数的输入,这里必须是长参数test,而不能是短参数t
       getString, err := cmd.PersistentFlags().GetString("test1")
       if err != nil {
          fmt.Println(err)
       } else {
          fmt.Printf("我成功拿到了%s命令", getString)
       }
    },
 }
 var testCmd2 = &cobra.Command{
    Use:   "test2",
    Short: "我是test2命令的简要描述",
    Long:  `我是test2命令的长描述,我负责测试。可以把你输入的参数进行输出。`,
    Run: func(cmd *cobra.Command, args []string) {
       fmt.Println("我是test2,我被调用了")
       //获取test参数的输入,这里必须是长参数test,而不能是短参数t
       getString, err := cmd.PersistentFlags().GetString("test2")
       if err != nil {
          fmt.Println(err)
       } else {
          fmt.Printf("我成功拿到了%s命令", getString)
       }
    },
 }
 ​
 func init() {
    rootCmd.AddCommand(testCmd1)
    rootCmd.AddCommand(testCmd2)
    //添加长参数test和短参数t,需要注意的是短参数这里只能是单个字符
    //StringP("长参数", "短参数", "默认值", "参数描述")
    testCmd1.PersistentFlags().StringP("test", "t", "", "我是全局测试")
    testCmd2.PersistentFlags().StringP("test2", "2", "", "我是全局测试")
 }

这里需要注意的是,这里输入的test是文件的名字,也就是前面添加命令cobra-cli add test的命令名字,因为我们就是在test文件下写的两个子命令。

查看test2命令的help

然后再执行

现在回过头来看root.go内容,同理也是把注释去掉,并且添加中文注释:

 package cmd
 ​
 import (
     "github.com/spf13/cobra"
     "os"
 )
 ​
 // 在不调用任何子命令的情况下,rootCmd表示基本命令
 var rootCmd = &cobra.Command{
     Use:   "root",
     Short: "我是root命令的简要描述",
     Long:  `我是root命令的长描述。`,
     // 由于root这个是主命令,不需要执行什么操作,只原来查看命令的信息的
     // 因此我们这里就不添加Run: func(cmd *cobra.Command, args []string) {}来执行功能
 }
 ​
 // 不需要去动他
 func Execute() {
     err := rootCmd.Execute()
     if err != nil {
         os.Exit(1)
     }
 }
 ​
 func init() {
     // 在这里您将定义您的标志和配置设置。Cobra支持持久标志,如果在这里定义,它将是应用程序的全局标志。
     // rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.awesomeProject.yaml)")
 ​
     // Cobra也支持本地标志,它只会在直接调用此操作时运行。
     rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
 }

然后运行,可以发现长描述和Usage发现了变化