1、准备 1.1 资源和文档
1.2 下载 使用 go get命令下载:
1 go get -u github.com/spf13/cobra
2、使用 2.1 基本使用
在工程中新建cmd文件夹,并添加root命令:在cmd文件夹下新建root.go文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package cmdimport ( "fmt" "github.com/spf13/cobra" "os" ) var rootCmd = &cobra.Command{ Use: "CobraExample" , Short: "cobra use example" , Long: `An application show how to use cobra library. Author:roc Blog:makerinchina.cn` ,} func Excute () { if err:= rootCmd.Execute(); err!=nil { fmt.Println(err) os.Exit(1 ) } }
然后在main函数中执行,main.go 文件内容如下:
1 2 3 4 5 6 7 8 package mainimport "cli_cobra_example/cmd" func main () { cmd.Excute() }
执行 go build,编译程序,然后执行可以看到如下输出:
1 2 3 An application show how to use cobra library. Author:roc Blog:makerinchina.cn
2.2 添加自己的命令 有了第一步的基础后,我们可以添加自己的命令,这里添加一个test命令,执行后输出test提示。
先在cmd文件夹下新建test.go 文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 package cmdimport ( "fmt" "github.com/spf13/cobra" ) var testCmd = &cobra.Command{ Use: "testCmd" , Short: "A test cmd" , Run: testCmdFunc, } func testCmdFunc (cmd *cobra.Command, args []string ) { fmt.Println("test cmd function execute." ) if len (args) > 0 { i := 0 for i=0 ;i<len (args);i++ { fmt.Printf(" args[%d]:%s\r\n" , i, args[i]) } } } func init () { rootCmd.AddCommand(testCmd) }
此时编译后执行程序输出如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 An application show how to use cobra library. Author:roc Blog:makerinchina.cn Usage: CobraExample [command] Available Commands: help Help about any command testCmd A test cmd Flags: -h, --help help for CobraExample Use "CobraExample [command] --help" for more information about a command.
如果执行程序带上命令和参数: app testCmd arg1 arg2, 则输出如下:
1 2 3 4 test cmd function execute. args[0]:arg1 args[1]:arg2
2.3 使用命令标志Flags (1) 全局命令标志 这种标志定义后会作用于定义它的命令和它的子命令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package cmdimport ( "fmt" "github.com/spf13/cobra" "os" ) var rootCmd = &cobra.Command{ Use: "CobraExample" , Short: "cobra use example" , Long: `An application show how to use cobra library. Author:roc Blog:makerinchina.cn` , Run: func (cmd *cobra.Command, args []string ) { fmt.Println("root cmd execute function." ) }, } var flags1 string func init () { rootCmd.PersistentFlags().StringVarP(&flags1,"flags1" ,"f" ,"default value" ,"flag defined in rootcmd." ) } func Excute () { if err:= rootCmd.Execute(); err!=nil { fmt.Println(err) os.Exit(1 ) } }
执行程序并带 -h 参数输出如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 An application show how to use cobra library. Author:roc Blog:makerinchina.cn Usage: CobraExample [flags] CobraExample [command] Available Commands: help Help about any command testCmd A test cmd Flags: -f, --flags1 string flag defined in rootcmd. (default "default value") -h, --help help for CobraExample Use "CobraExample [command] --help" for more information about a command.
然后执行程序并带子命令参数: app testCmd -h,也会有-f的标志,输出如下:
1 2 3 4 5 6 7 8 9 10 A test cmd Usage: CobraExample testCmd [flags] Flags: -h, --help help for testCmd Global Flags: -f, --flags1 string flag defined in rootcmd. (default "default value")
(2) 特定命令标志 这种标志仅仅用于定义它的命令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 package cmdimport ( "fmt" "github.com/spf13/cobra" ) var testCmd = &cobra.Command{ Use: "testCmd" , Short: "A test cmd" , Run: testCmdFunc, } var testFlag1 string func testCmdFunc (cmd *cobra.Command, args []string ) { fmt.Println("test cmd function execute." ) if len (args) > 0 { i := 0 for i=0 ;i<len (args);i++ { fmt.Printf(" args[%d]:%s\r\n" , i, args[i]) } } strflag, _ := cmd.Flags().GetString("testflag" ) fmt.Println("local cmd flags:" , strflag) strflagroot, _ := rootCmd.Flags().GetString("flags1" ) fmt.Println("root cmd flags:" , strflagroot) } func init () { rootCmd.AddCommand(testCmd) testCmd.Flags().StringVarP(&testFlag1,"testflag" ,"t" ,"default value1" , "test cmd flag1" ) }
可以看到输出如下:
1 2 3 4 5 6 7 8 9 10 11 A test cmd Usage: CobraExample testCmd [flags] Flags: -h, --help help for testCmd -t, --testflag string test cmd flag1 (default "default value1") Global Flags: -f, --flags1 string flag defined in rootcmd. (default "default value")
1 app testCmd arg1 -f global_flag -t local_flag
输出结果如下:
1 2 3 4 test cmd function execute. args[0]:arg1 local cmd flags: local_flag root cmd flags: global_flag