go cobra 包的使用
一般的命令行遵循一下模式
APPNAME VERB NOUN --ADJECTIVE
或者 APPNAME COMMAND ARG --FLAG
最简单的例子
package main
import (
"fmt"
"github.com/spf13/cobra"
"os"
)
var rootCmd = &cobra.Command{
Use: "test",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("welcome to cobra")
},
}
func main() {
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
新增一个查看版本的命令
package main
import (
"fmt"
"github.com/spf13/cobra"
"os"
)
var rootCmd = &cobra.Command{
Use: "test",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("welcome to cobra")
},
}
var versionCmd = &cobra.Command{
Use: "version",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("v1.0.0")
},
}
func main() {
//将versionCmd命令添加到根命令中
rootCmd.AddCommand(versionCmd)
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
添加参数
新增init方法
var Verbose bool
var Source string
var Region string
var Num int32
var addCmd = &cobra.Command{
Use: "add",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("num =", Num)
},
}
func init() {
// 持久命令,意思是rootCmd命令和其子命令都能够使用这个参数
rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output")
// 本地命令,意思是只有rootCmd命令才能够使用该参数,如果其他命令设置了改参数则会报错
rootCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from")
rootCmd.Flags().StringVarP(&Region, "region", "r", "", "AWS region (required)")
// 标记 region 是必须的,如果没有该参数,则会报错
rootCmd.MarkFlagRequired("region")
// 其他命令的参数
addCmd.Flags().Int32VarP(&Num, "num", "n", 0, "Number")
}
参数验证器
cobra.NoArgs 如果任何位置有参数,就报错
cobra.ArbitraryArgs 接收任何参数
cobra.MinimumNArgs(int) 如果少于n个参数就报错
cobra.MaximumNArgs(int) 如果大于n个参数就报错
cobra.ExactArgs(int) 如果不等于n个参数就报错
var cmd = &cobra.Command{
Short: "hello",
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Hello, World!")
},
}