当前位置:首页 > 文章列表 > Golang > Go教程 > 玩转Go命令行工具Cobra

玩转Go命令行工具Cobra

来源:脚本之家 2022-12-31 10:51:01 0浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《玩转Go命令行工具Cobra》,聊聊Cobra、命令行工具,希望可以帮助到正在努力赚钱的你。

不知大家有没有在使用Git命令、Linux的yum命令、Go命令、Maven命令的时候感觉到非常的酷,比如你刚刚拿到一个Go的开源项目,初始化时只需要输入go mod tidy进行对依赖的下载,或者是git clone xxx之后拉下来一个GitHub上的项目,mvn package或者go build就可以将整合项目打包成一个可执行的文件,当然这些操作现在大多数都能通过可视化的UI界面进行,但是就少了一些韵味,还是使用原生的CLI工具最能体现程序执行的过程,并且真是的生产环境中大多数也只能通过这种命令的方式来进行,因此我们就有必要搞一下这个大蟒蛇工具——Cobra。

1 简介

在这里插入图片描述

GitHub:https://github.com/spf13/cobra

Cobra是一个用于创建强大的现代CLI应用程序的库。在很多围棋项目中使用,比如Kubernetes, Hugo和GitHub CLI等等。

那么什么是CLI呢,简单来讲就是命令行工具界面,Command Line Interface for batch scripting的简称,在我们开发中广泛的使用,比如你打开Git Bash,输入git clone XXX,这个就是操作Git的命令行工具界面。

除此之外,Cobra还提供:

  • 简单的基于子命令的cli:应用服务器,应用获取,等等。
  • 完全兼容posix的标志(包括短版本和长版本)
  • 嵌套的子命令
  • 全局、本地和级联标志
  • 命令和标志的自动帮助生成
  • 自动识别-h、——help等帮助标志。
  • 为您的应用程序自动生成shell自动完成(bash, zsh, fish, powershell)
  • 为您的应用程序自动生成的手册页
  • 命令别名,以便您可以更改而不破坏它们
  • 定义自己的帮助、用法等的灵活性。

什么是命令&参数&标识符?

Cobra 是构建在命令、参数和标识符之上的:

  • Commands 表示执行动作
  • Args 就是执行参数
  • Flags 是这些动作的标识符

基本的执行命令如下所示:

$ APPNAME Command Args --Flags 
# 或者
$ APPNAME Command --Flags Args

2 安装

2.1 安装Cobra-cli脚手架工具

go install github.com/spf13/cobra-cli@latest

下载完成之后会在我们的$GOPATH目录的bin目录下生成一个二进制的文件cobra-cli.exe(Windows下)或cobra-cli(LInux下),如果出现问题,如:

在这里插入图片描述

我们可以直接找到$GO_PATH\pkg\mod\github.com\spf13\cobra-cli@v1.3.0目录,直接go build自己编译一个二进制文件。

之后一步,为了方便使用我们可以将生成的二进制文件放在环境变量里,让他在任何地方都能使用,步骤过于简单就忽略了哈。

2.2 在项目中下载Cobra依赖

go get -u github.com/spf13/cobra@latest

3 使用方式

其实在使用方式这一块有两种方法,一种是自己直接写代码,另一种就是使用刚刚我们安装的cobra-cli来生成脚手架代码,我们就在Hello World里面将cobra-cli生成代码试一遍。

3.1 Hello World

首先在项目根目录下打开终端(必须是Go Module项目),然后输入命令cobra-cli init就会在项目中生成如下代码:

在这里插入图片描述

我们看下具体的代码:

main.go

package main

import "go-cobra/cmd"

func main() {
   cmd.Execute()
}

root.go

package cmd

import (
   "os"

   "github.com/spf13/cobra"
)

// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
   Use:   "go-cobra",
   Short: "A brief description of your application",
   Long: `A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
   // Uncomment the following line if your bare application
   // has an action associated with it:
   // Run: func(cmd *cobra.Command, args []string) { },
}

// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
   err := rootCmd.Execute()
   if err != nil {
      os.Exit(1)
   }
}

func init() {
   // Here you will define your flags and configuration settings.
   // Cobra supports persistent flags, which, if defined here,
   // will be global for your application.

   // rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.go-cobra.yaml)")

   // Cobra also supports local flags, which will only run
   // when this action is called directly.
   rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

我们将root.go里面的代码进行部分修改:

package cmd

import (
   "fmt"
   "github.com/spf13/cobra"
   "os"
)

var name string

var rootCmd = &cobra.Command{
   Use: "hello",
   Run: func(cmd *cobra.Command, args []string) {
      fmt.Println("hello ", name)
   },
}

func Execute() {
   err := rootCmd.Execute()
   if err != nil {
      os.Exit(1)
   }
}

func init() {
   rootCmd.Flags().StringVarP(&name, "name", "", "world", "")
}

测试:

$ go build

$ .\go-cobra.exe --name zs
hello  zs

$ .\go-cobra.exe
hello  world

3.2 开发自己的Cli命令

使用cobra-cli脚手架,或者也可以自己手写如下代码

cobra-cli add hi

这个时候我们就会发现多了一个文件,当然也可以自己手写代码:

在这里插入图片描述

在hi.go文件中代码:

package cmd

import (
   "fmt"
   "github.com/spf13/cobra"
)

var (
   age     int
   like    []string
   address string
)

var hiCmd = &cobra.Command{
   Use:   "hi",
   Short: "",
   Long:  "",
   Run: func(cmd *cobra.Command, args []string) {
      Print()
   },
}

func init() {
   rootCmd.AddCommand(hiCmd)
   hiCmd.Flags().StringVarP(&name, "name", "", "world", "")
   hiCmd.Flags().IntVarP(&age, "age", "", 1, "")
   hiCmd.Flags().StringSliceVarP(&like, "like", "", []string{}, "")
   hiCmd.Flags().StringVarP(&address, "address", "", "Beijing", "")
}

func Print() {
   fmt.Println("name:", name)
   fmt.Println("age:", age)
   fmt.Println("like:", like)
   fmt.Println("address:", address)
}

测试:

.\go-cobra.exe hi --name zs --age 100 --like Coding,Running --address ShangHai
name: zs
age: 100
like: [Coding Running]
address: ShangHai

3.3 规则和扩展使用

3.3.1 我们不难看出规则

新增命令就是自定义&cobra.Command

新增标识符就是命令.Flags().xxx

新增的命令都需要在rootCmd中添加,新增的标识符都要在init中添加

3.3.2 小扩展

一些常用到的方法:

  • NoArgs:如果有任何参数,命令行将会报错
  • ArbitraryArgs: 命令行将会接收任何参数
  • OnlyValidArgs: 如果有如何参数不属于 Command 的 ValidArgs 字段,命令行将会报错
  • MinimumNArgs(int): 如果参数个数少于 N 个,命令行将会报错
  • MaximumNArgs(int): 如果参数个数多于 N 个,命令行将会报错
  • ExactArgs(int): 如果参数个数不等于 N 个,命令行将会报错
  • RangeArgs(min, max): 如果参数个数不在 min 和 max 之间, 命令行将会报错

3.3.3 自定义帮助命令

...
var hiCmd = &cobra.Command{
   Use:   "hi",
   Short: "sss",
   Long:  "lll",
   Run: func(cmd *cobra.Command, args []string) {
      if len(args) == 0 {
         cmd.Help()
         return
      }
      Print()
   },
}
...

测试:

$ .\go-cobra.exe hi                                                             
Usage:
  hello hi [flags]


Usage:
  hello hi [flags]

Flags:
      --address string    (default "Beijing")
      --age int           (default 1)
  -h, --help             help for hi
      --like strings
      --name string       (default "world")

4 小总结

本文介绍了Cobra的最基本也是最常用的使用部分,但是Cobra仍然有很多优秀的操作值得我们学习。拜拜喽~

理论要掌握,实操不能落!以上关于《玩转Go命令行工具Cobra》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
Go 语言前缀树实现敏感词检测Go 语言前缀树实现敏感词检测
上一篇
Go 语言前缀树实现敏感词检测
Go中使用gjson来操作JSON数据的实现
下一篇
Go中使用gjson来操作JSON数据的实现
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 笔灵AI生成答辩PPT:高效制作学术与职场PPT的利器
    笔灵AI生成答辩PPT
    探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    9次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    20次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    28次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    37次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    34次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码