Go cobra库使用教程

 更新时间:2022年12月14日 15:20:23   作者:kina100  
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,实际上这个名字可以随便命名,一般来说,你创建的啥命令就写啥名字,这不是为了好找么。

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

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

main.go ↓

package main
import "cobraTest/cmd"
func main() {
	cmd.Execute()
}

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

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

go build

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

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

三,测试

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

.\cobraTest.exe myOrder

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

四,增加flag参数

package cmd
import (
	"fmt"
	"github.com/spf13/cobra"
)
var rootCmd = cobra.Command{
	// 命令的名称
	Use: "myOrder",
	// 剪短介绍
	Short: "这是一个我的私有命令",
	// 详细介绍
	Long: "自定义私有命令,主要是想测试下这玩意能不能用",
	// 普通运行,如果需要返回error要使用RUNE
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("这是一条myOrder命令的反馈,反正啥也没处理")
        // 读取第一个flag 参数
		getString, _ := cmd.Flags().GetString("hahaha")
		fmt.Println(getString)
        // 读取第二个flag 参数
		getString, _ = cmd.Flags().GetString("heiheihei")
		fmt.Println(getString)
	},
}
func Execute() {
    // 增加一个flag 参数
    // flag参数的名称,示例值,flag参数解释
	rootCmd.PersistentFlags().String("hahaha", "", "随便写点啥吧")
    // 再增加一个flag 参数
	rootCmd.Flags().String("heiheihei", "", "输入一些东西")
	if err := rootCmd.Execute(); err != nil {
		fmt.Println("这里有错误", err)
	}
}

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

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

五,额外命令

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

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

firstOrder.go ↓

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

secondOrder.go ↓

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

main.go ↓

package main
import (
	"cobraTest/cmd"
	"fmt"
	"github.com/spf13/cobra"
)
func main() {
	rootCmd := cobra.Command{
		Use:              "rootOrder",
		Short:            "根命令",
		TraverseChildren: true,
	}
	// 把这两条命令加入到根命令里面
	rootCmd.AddCommand(&cmd.FirstCmd)
	rootCmd.AddCommand(&cmd.SecondCmd)
	if err := rootCmd.Execute(); err != nil {
		fmt.Println("Could not run command")
	}
}

执行go build

到此这篇关于Go cobra库使用教程的文章就介绍到这了,更多相关Go cobra内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入探索Go语言中unsafe包的使用

    深入探索Go语言中unsafe包的使用

    Go语言的unsafe包被誉为黑科技,它为Go语言提供了底层访问和操控内存的能力,本文将深入探讨Go语言中unsafe包的使用方法和注意事项,需要的可以参考一下
    2023-04-04
  • 如何有效控制Go线程数实例探究

    如何有效控制Go线程数实例探究

    这篇文章主要为大家介绍了如何有效控制 Go 线程数的问题探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 解决goxorm无法更新值为默认值的问题

    解决goxorm无法更新值为默认值的问题

    这篇文章主要介绍了解决goxorm无法更新值为默认值的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言中利用http发起Get和Post请求的方法示例

    Go语言中利用http发起Get和Post请求的方法示例

    这篇文章主要给大家介绍了关于Go语言中利用http发起Get和Post请求的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • Go接口构建可扩展Go应用示例详解

    Go接口构建可扩展Go应用示例详解

    本文深入探讨了Go语言中接口的概念和实际应用场景。从基础知识如接口的定义和实现,到更复杂的实战应用如解耦与抽象、多态、错误处理、插件架构以及资源管理,文章通过丰富的代码示例和详细的解释,展示了Go接口在软件开发中的强大功能和灵活性
    2023-10-10
  • 一文带你了解Golang中reflect反射的常见错误

    一文带你了解Golang中reflect反射的常见错误

    go 反射的错误大多数都来自于调用了一个不适合当前类型的方法, 而且,这些错误通常是在运行时才会暴露出来,而不是在编译时,如果我们传递的类型在反射代码中没有被覆盖到那么很容易就会 panic。本文就介绍一下使用 go 反射时很大概率会出现的错误,需要的可以参考一下
    2023-01-01
  • Golang WebView跨平台的桌面应用库的使用

    Golang WebView跨平台的桌面应用库的使用

    Golang WebView是一个强大的桌面应用库,本文介绍了Golang WebView的特点和使用方法,并列举示例详细的介绍了其在实际项目中的应用,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 浅析go中的map数据结构字典

    浅析go中的map数据结构字典

    golang中的map是一种数据类型,将键与值绑定到一起,底层是用哈希表实现的,可以快速的通过键找到对应的值。这篇文章主要介绍了go中的数据结构字典-map,需要的朋友可以参考下
    2019-11-11
  • GoLang使goroutine停止的五种方法实例

    GoLang使goroutine停止的五种方法实例

    goroutine是Go并行设计的核心,下面这篇文章主要给大家介绍了关于GoLang使goroutine停止的五种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Go语言开发中有了net/http为什么还要有gin的原理及使用场景解析

    Go语言开发中有了net/http为什么还要有gin的原理及使用场景解析

    这篇文章主要为大家介绍了Go语言有了net/http标准库为什么还要有gin第三方库的原理及使用场景详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论