下载:go install github.com/spf13/cobra-cli@latest
执行init创建一个初始项目:cobra-cli init
发现多了个cmd/root.go
和main.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发现了变化
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。