前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go cobra CLI工具库的简单入门

go cobra CLI工具库的简单入门

原创
作者头像
用户8478947
发布2023-01-26 17:48:28
9380
发布2023-01-26 17:48:28
举报
文章被收录于专栏:安全学习安全学习

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

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

image-20230125190908013
image-20230125190908013

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

image-20230125191046601
image-20230125191046601

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

image-20230126164926812
image-20230126164926812

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

代码语言:javascript
复制
 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程序和项目名一致。

image-20230126170105596
image-20230126170105596

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

image-20230126170255327
image-20230126170255327

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

image-20230126171031838
image-20230126171031838

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

image-20230126171118316
image-20230126171118316

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

代码语言:javascript
复制
 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文件下写的两个子命令。

image-20230126174011624
image-20230126174011624

查看test2命令的help

image-20230126174307582
image-20230126174307582

然后再执行

image-20230126174346897
image-20230126174346897

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

代码语言:javascript
复制
 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发现了变化

image-20230126173123841
image-20230126173123841

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档