首页 > 其他分享 >go cobra实例讲解

go cobra实例讲解

时间:2024-09-23 15:12:03浏览次数:8  
标签:cobra version demo sunshine flag 实例 go name

go cobra实例讲解

概述

cobra 库是 golang 的一个开源第三方库,能够快速便捷的建立命令行应用程序。

优势:cobra 可以快速建立CLI程序,使我们更专注于命令需要处理的具体的业务逻辑。

举两个例子:

复制代码
hugo server --port=1313
git clone URL --bare

都是命令行程序。

基本概念

cobra由三部分构成:commandsarguments 和 flags

commands:表示要执行的动作。每一个 command 表示应用程序的一个动作。每个命令可以包含子命令。

arguments:给动作传入的参数。

flags:表示动作的行为。可以设置执行动作的行为。flags 包括两种:对某个命令生效和对所有命令生效。

安装方法

复制代码
go get -u github.com/spf13/cobra/cobra

github地址:https://github.com/spf13/cobra

使用方法

1.创建cobra命令行应用程序

复制代码
cobra init code.byted.org/dfic/demo

在 $GOPATH/src/code.byted.org.dfic/ 目录下创建一个名为 demo 的 cobra 命令行应用程序

main.go 文件,完成初始化 cobra 功能。

第一次初始化可能会出现这个问题 Error: required flag(s) "pkg-name" not set 解决办法

复制代码
package main
 
import "code.byted.org/dfic/demo/cmd"
 
func main() {  
    cmd.Execute()
}

2.添加命令

2.1.基本用法

cobra add version

cmd 文件夹下生成一个新的文件 version.go,定义这个新的命令的动作。

文件内容如下:

复制代码
import (  
    "fmt"
 
    "github.com/spf13/cobra"
)
 
// versionCmd represents the version command
var versionCmd = &cobra.Command{  
    Use:   "version",
    Short: "A brief description of your command",
    Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. 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.`,  
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("version called")
    },
}
 
func init() {  
    rootCmd.AddCommand(versionCmd)
 
    // Here you will define your flags and configuration settings.
 
    // Cobra supports Persistent Flags which will work for this command
    // and all subcommands, e.g.:
    // versionCmd.PersistentFlags().String("foo", "", "A help for foo")
 
    // Cobra supports local flags which will only run when this command
    // is called directly, e.g.:
    // versionCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

编译运行

复制代码
> go build -o demo
 
> ./demo -h
 
Usage:  
  demo [command]
 
Available Commands:  
  help        Help about any command
  version     A brief description of your command
 
Flags:  
      --config string   config file (default is $HOME/.demo.yaml)
  -h, --help            help for demo
  -t, --toggle          Help message for toggle
 
执行新添加的命令
> ./demo version
输出:version called

2.2.修改命令行为

将命令的行为添加到命令结构Run参数对应的方法中

复制代码
var versionCmd = &cobra.Command{  
    Use:   "version",
    Short: "A brief description of your command",
    Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. 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.`,  
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("version called")
    },
}

3.添加flag

3.1.添加局部flag

在 version.go 文件的 init 函数中添加 局部flag

复制代码
func init() {  
    rootCmd.AddCommand(versionCmd)
    versionCmd.Flags().BoolP("test", "t", false, "test")
}

执行命令

复制代码
> ./demo version -h
 
Usage:  
  demo version [flags]
 
Flags:  
  -h, --help   help for version
  -t, --test   test
 
Global Flags:  
      --config string   config file (default is $HOME/.demo.yaml)

4. flag赋值

如果需要使用 全局flag 或者 局部flag,需要在合适的作用域内定义变量存储 flag 值,以便 flag 可在特定作用域内生效。

4.1.使用全局flag

让一个 flag 对所有命令生效,需要在 root.go 文件中创建一个变量存储 flag 值。

如需要定义一个全局flag name:

复制代码
1.在root.go 文件中添加一个变量name
 
var name string
 
2.在init函数中添加全局flag,将flag值存储到变量name中
 
rootCmd.PersistentFlags().StringVar(&name, "name", "", "set name")
 
 
3.在子命令version的Run方法中输出name  
Run: func(cmd *cobra.Command, args []string) {  
    fmt.Println("name is: ", name)
}
 
 
4.执行命令  
./demo version --name wfl
输出:
name is:  wfl  

4.2.使用局部flag

让一个 flag 对某个命令生效,需要在该命令文件中创建一个变量存储 flag 值。

如需要给version命令定义一个局部flag name:

复制代码
1.定义变量sunsine  
var sunshine string
 
 
2.在version.go的init函数中添加flag  
versionCmd.Flags().StringVarP(&sunshine, "sunshine", "s", "false", "you are my sunshine")
 
 
3.在子命令version.go的Run方法中输出  
Run: func(cmd *cobra.Command, args []string) {  
    fmt.Println("name is: ", name)
    fmt.Println("sunshine is: ", sunshine)
}
 
 
4.执行命令  
./demo version --name wfl --sunshine wfl
输出:
name is:  wfl  
sunshine is:  wfl  

问题:

将 flags 存储到本地变量当中,那么其他命令是不是也可以用某个命令的 局部flag 呢?

答:不可以。局部flag虽然是定义在某个命令文件中作为局部变量,cmd 文件夹下的其他文件可以访问这个变量,但是其他命令如果没有定义自己的 局部flag 获取相同 flag 值的话,获取到的值是该局部变量的零值。

复制代码
1.添加一个新命令helloworld  
> cobra add helloworld
 
 
2.输出sunshine值  
Run: func(cmd *cobra.Command, args []string) {  
    fmt.Println("sunshine is: ", sunshine)
}
 
 
3.执行命令  
> ./demo helloworld --sunshine wfl
Error: unknown flag: --sunshine  
输出错误未知flag。
原因就是该命令并未定义局部flagsunshine

4.3.必填flag

默认情况下,flag是optional(选填),若flag为必填,则需要做如下设置

如将version命令下的sunshine flag设置为必填

复制代码
1.init文件中增加flag定义  
versionCmd.Flags().StringVarP(&sunshine, "sunshine", "s", "", "you are my sunshine")  
versionCmd.MarkFlagRequired("sunshine")
 
2.执行  
> ./demo version
 
3.输出  
Error: required flag(s) "sunshine" not set  
说明必须要设置flag sunshine
 
4.传入sunshineflag  
> ./demo version --sunshine wfl
输出: sunshine is:  wfl

5. 嵌套子命令

cobra 的命令行工具可以创建嵌套子命令。使用 cobra add -p "父命令Cmd"。

比如

复制代码
1.给version命令添加一个子命令show  
> cobra add show -p "versionCmd"
 
 
2.在cobra生成的show.go文件的init方法中,自动将showCmd添加到versionCmd下作为子命令  
func init() {  
    versionCmd.AddCommand(showCmd)
}
 
 
3.执行嵌套子命令  
> ./demo version show
show called  

6. 获取命令行参数值

cobra 常用的参数配置校验器如下:

复制代码
MinimumNArgs(int) 当参数数目低于配置的最小参数个数时报错  
MaximumNArgs(int) 当参数数目大于配置的最大参数个数时报错  
ExactArgs(int)    如果参数数目不是配置的参数个数时报错  
NoArgs            没有参数则报错  

类似 git clone URL 这种类型的命令行,URL 为传给 clone 命令的参数

获取URL的值,可以从 args 参数中直接取出

举例:

复制代码
1.添加一个命令path  
> cobra add path
 
2.设置该命令需要且仅需要一个参数,并在Run方法中取出参数  
var pathCmd = &cobra.Command{  
    Use:   "path [path]",
    Short: "A brief description of your command",
    Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. 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.`,  
    Args: cobra.ExactArgs(1),
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("path called")
        fmt.Println("path:", args[0])
    },
}
 
3. 执行命令并输出  
> ./demo path /home
path: /home  
     

标签:cobra,version,demo,sunshine,flag,实例,go,name
From: https://www.cnblogs.com/rxbook/p/18427116

相关文章

  • 基于django+vue基于O2O模式的外卖订餐系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,电子商务已渗透到人们生活的方方面面,其中外卖订餐系统作为“互联网+餐饮”的典型代表,近年来在全球范围内迅速崛......
  • 基于django+vue基于MVVM架构家政服务平台【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会经济的快速发展与生活节奏的加快,现代家庭对于家政服务的需求日益增长,从日常清洁、照料老人儿童到专业护理、家居维修等,家政服务已......
  • 基于django+vue基于MVC框架的新闻发布系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,信息传播的速度与广度达到了前所未有的高度。新闻作为社会信息的重要载体,其发布与传播的效率和准确性直接关系到......
  • 基于django+vue基于MVC的社区党建信息系统的设计与实现【开题报告+程序+论文】-计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和党建工作的不断深入,传统的社区党建管理模式已难以满足新时代下党员管理、组织生活及信息传递的高效性需求。社区......
  • mongodb 中rs.stauts()命令参数解析
    rs.status()命令用于获取MongoDB副本集的状态信息。它提供了关于副本集中各个节点的详细信息,包括节点的健康状况、角色、选举状态等。以下是查看一个mongo集群状态返回的参数:rs0:PRIMARY>rs.status(){"set":"rs0","date":ISODate("2024-09-14T06:4......
  • mongo 副本集rs 理解和使用小结
    在MongoDB中,rs(通常指的是“replicaset”的缩写)是复制集(ReplicaSet)的标识符或在使用时的一种常见前缀,尤其是在命令行工具和脚本中引用复制集时。复制集是MongoDB用来实现数据冗余和高可用性的一个核心组件。复制集(ReplicaSet)的作用:数据冗余:复制集在多个服务器上维护相同数据的......
  • Go 语言框架接入阿里云的报警通知与日志实时追踪与监控
    在现代应用开发中,实时监控和报警是确保系统稳定性和高可用性的重要组成部分。本文将介绍如何使用Go语言框架接入阿里云的报警通知与日志追踪。##1.环境准备###1.1安装Go确保你的开发环境中已经安装了Go语言。可以从[Go官网](https://golang.org/dl/)下载并安......
  • 关于Go的并发
    前面我们提到因为Go语言的高并发、高性能,所以选择Go,这次我们看看Go的高并发。并发编程关于并发和并行并发:早期计算机的CPU都是单核的,一个CPU在同一时间只能执行一个进程/线程,当系统中有多个进程/线程等待执行时,CPU只能执行完一个再执行下一个。简单来讲,并发就是多线......
  • 从零开始一个git操作实例,图文并茂
    徒弟不懂git怎么用,于是写了篇文章,把本地git操作从头写了一遍,自己去看吧!0、基本概念•Git是一个免费、开源的、分布式版本控制系统•它使用一个特殊的叫做仓库的数据库来记录文件的变化•仓库中的每个文件都有一个完整的版本历史记录1)安装sudoapt-updatesudoapt-geti......
  • Django 路由层 —— 基础用法,以及底层如何实现的
    路由层负责网页URL与函数/类的对应关系用法基本用法urls.py:urlpatterns=[#基本用法path('login/',views.login),#动态输入参数path('info/<int:v1>',views.info),#可以同时传多个参数,path:v3会记录v1-v2/后面的所有路径......