• Go cobra 库学习


    cobra既是一个用于创建强大现代CLI应用程序的库,也是一个生成应用程序和命令文件的程序。cobra被用在很多go语言的项目中,比如 Kubernetes、Docker、Istio、ETCD、Hugo、Github CLI等等


    其实简单的来说,cobra就是一个自定义命令工具,我们经常使用一些命令来构建项目,但是这些命令都是go自带的,你想写自己的命令就可以使用cobra库来试一试。

    一,安装

    $ go get -u github.com/spf13/cobra

    二,简单的cobra项目

    先构建一个简单的cobra命令,以此来熟悉cobra是怎么用的

    创建一个cmd目录,在目录里创建一个myOrder.go,实际上这个名字可以随便命名,一般来说,你创建的啥命令就写啥名字,这不是为了好找么。

    1. package cmd
    2. import (
    3. "fmt"
    4. "github.com/spf13/cobra"
    5. )
    6. var rootCmd = cobra.Command{
    7. // 命令的名称
    8. Use: "myOrder",
    9. // 剪短介绍
    10. Short: "这是一个我的私有命令",
    11. // 详细介绍
    12. Long: "自定义私有命令,主要是想测试下这玩意能不能用",
    13. // 普通运行,如果需要返回error要使用RUNE
    14. Run: func(cmd *cobra.Command, args []string) {
    15. fmt.Println("这是一条myOrder命令的反馈,反正啥也没处理")
    16. },
    17. }
    18. func Execute() {
    19. if err := rootCmd.Execute(); err != nil {
    20. fmt.Println("这里有错误", err)
    21. }
    22. }

    然后在main.go 入口里运行Execute即可

    main.go ↓

    1. package main
    2. import "cobraTest/cmd"
    3. func main() {
    4. cmd.Execute()
    5. }

    cobraTest是这个项目的名字,cmd是刚才创建的那个包(目录)。

    此时是不能直接像往常一样go run的,要先构建为可执行文件,在windows上就是exe

    go build
    

    go build之后会发现目录里多出了一个可执行文件,

     这时候我们可以进行简单的测试

    三,测试

    执行可执行文件,并且带上我们刚才的那个命令

    .\cobraTest.exe myOrder

     这就是刚才写的那个RUN 里面的运行结果

    四,增加flag参数

    1. package cmd
    2. import (
    3. "fmt"
    4. "github.com/spf13/cobra"
    5. )
    6. var rootCmd = cobra.Command{
    7. // 命令的名称
    8. Use: "myOrder",
    9. // 剪短介绍
    10. Short: "这是一个我的私有命令",
    11. // 详细介绍
    12. Long: "自定义私有命令,主要是想测试下这玩意能不能用",
    13. // 普通运行,如果需要返回error要使用RUNE
    14. Run: func(cmd *cobra.Command, args []string) {
    15. fmt.Println("这是一条myOrder命令的反馈,反正啥也没处理")
    16. // 读取第一个flag 参数
    17. getString, _ := cmd.Flags().GetString("hahaha")
    18. fmt.Println(getString)
    19. // 读取第二个flag 参数
    20. getString, _ = cmd.Flags().GetString("heiheihei")
    21. fmt.Println(getString)
    22. },
    23. }
    24. func Execute() {
    25. // 增加一个flag 参数
    26. // flag参数的名称,示例值,flag参数解释
    27. rootCmd.PersistentFlags().String("hahaha", "", "随便写点啥吧")
    28. // 再增加一个flag 参数
    29. rootCmd.Flags().String("heiheihei", "", "输入一些东西")
    30. if err := rootCmd.Execute(); err != nil {
    31. fmt.Println("这里有错误", err)
    32. }
    33. }

    在设定完rootCmd后,就可以直接给rootCmd结构体增加flag参数,并在run里面读取出来,修改代码后要重新go build,之后执行命令的时候,加上flag参数

    .\cobraTest.exe myOrder --hahaha 哈哈哈 --heiheihei 嘿嘿嘿

    五,额外命令

    有的文章说这是子命令,其实是不恰当的,这是为了让一个工程可以有多条命令,而无需生成多个可执行文件。

     构建两个命令,并在main.go里面写一个根命令

    firstOrder.go ↓

    1. package cmd
    2. import (
    3. "fmt"
    4. "github.com/spf13/cobra"
    5. )
    6. // 大写可用于外部访问
    7. var FirstCmd = cobra.Command{
    8. // 命令的名称
    9. Use: "firstOrder",
    10. // 剪短介绍
    11. Short: "1号命令",
    12. // 普通运行,如果需要返回error要使用RUNE
    13. Run: func(cmd *cobra.Command, args []string) {
    14. fmt.Println("1号命令可以执行")
    15. },
    16. }

    secondOrder.go ↓

    1. package cmd
    2. import (
    3. "fmt"
    4. "github.com/spf13/cobra"
    5. )
    6. var SecondCmd = cobra.Command{
    7. // 命令的名称
    8. Use: "secondOrder",
    9. // 剪短介绍
    10. Short: "2号命令",
    11. // 普通运行,如果需要返回error要使用RUNE
    12. Run: func(cmd *cobra.Command, args []string) {
    13. fmt.Println("2号命令可以执行")
    14. },
    15. }

    main.go ↓

    1. package main
    2. import (
    3. "cobraTest/cmd"
    4. "fmt"
    5. "github.com/spf13/cobra"
    6. )
    7. func main() {
    8. rootCmd := cobra.Command{
    9. Use: "rootOrder",
    10. Short: "根命令",
    11. TraverseChildren: true,
    12. }
    13. // 把这两条命令加入到根命令里面
    14. rootCmd.AddCommand(&cmd.FirstCmd)
    15. rootCmd.AddCommand(&cmd.SecondCmd)
    16. if err := rootCmd.Execute(); err != nil {
    17. fmt.Println("Could not run command")
    18. }
    19. }

    执行go build

     

  • 相关阅读:
    MYSQL学习笔记1-window安装mysql5.7
    <模板进阶>——《C++高阶》
    Scala函数至简原则
    富文本编辑器(wangEdit)+(jquery.wordexport)实现web版在线编辑导出
    APISpace 发现好物节
    defer和async区别
    秋招每日一题T2——统计子矩阵
    前端首屏渲染时间的极致优化
    【无标题】
    Android 11源码——驱动设备节点的权限问题
  • 原文地址:https://blog.csdn.net/kina100/article/details/128151233