go cobra实例讲解

news/2024/9/23 15:20:48/文章来源:https://www.cnblogs.com/rxbook/p/18427116

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 mainimport "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 -hUsage:  demo [command]Available Commands:  help        Help about any commandversion     A brief description of your commandFlags:  --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 -hUsage:  demo version [flags]Flags:  -h, --help   help for version-t, --test   testGlobal 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 文件中添加一个变量namevar name string2.在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 string2.在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 helloworld2.输出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 version3.输出  
Error: required flag(s) "sunshine" not set  
说明必须要设置flag sunshine4.传入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 path2.设置该命令需要且仅需要一个参数,并在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  
 
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/802219.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多智能体协同控制(1)

引言 多智能体系统协同控制算法起源于计算机领域关于分布式计算的研究,后由于数学家们的强势加盟,控制领域的研究一度占领高地。随着人工智能的发展,以多智能体强化学习为代表作的计算机领域专家又重回巅峰。 目前,每年多智能体相关的论文的都浩如烟海,成就了一批手持屠龙…

Axure原型设计:多层级动态表格

多层级表格又成为树形表格,是在后台常用的一种表格形式,当表格数据存在多层级关系是,可以通过多层级表格,从而更加清晰的呈现数据内容,帮助人们更好地理解和分析数据之间的关系,从而更加有效地传递信息。 所以今天作者就教大家怎么在Axure里制作多层级动态表格,包括展开…

frp内网穿透 宝塔部署服务端、客户端教程

宝塔部署教程链接:https://blog.csdn.net/m0_57944649/article/details/140693257 frp官方下载链接:https://github.com/fatedier/frp/releases一、部署服务端1、上传好文件后解压2、进入解压好了的文件夹“frp_0.58.1_linux_amd64”中,找到文件“frps.toml”,双击打开: …

建立数据库连接时出现错误:原因与解决方案

建立数据库连接时出现错误的原因可能有很多,以下是一些常见的原因及其解决方案: 原因登录信息错误:账号、密码、服务器名称或数据库名称不正确。网络问题:客户端与数据库服务器之间的网络连接不稳定或中断。数据库服务未启动:数据库服务没有运行,或者在尝试连接时服务停止…

数据库连接失败的解决方法有哪些

当遇到数据库连接失败的情况时,可以按照以下步骤进行排查和解决:检查数据库服务状态:确认数据库服务是否已启动并运行正常。可以使用阿里云控制台的服务监控工具或通过SSH登录服务器,使用命令行工具(如service mysqld status)来检查服务状态。验证网络连接:确保你的应用…

数据库常见十大错误_数据库十大报错语句

数据库操作时可能会遇到各种错误,这些错误通常是由不同的原因引起的,比如语法错误、连接问题、权限问题等。下面是数据库操作中常见的几种错误类型及其解决思路:连接失败:错误信息可能包括“无法连接到主机”、“连接被拒绝”等。检查数据库服务是否启动、网络连接是否正常…

阿里云主机数据库链接失败怎么回事

阿里云主机数据库连接失败的问题可能有多种原因,这里列举了一些常见的原因及解决办法:网络问题:确认你的网络连接是否正常。尝试使用其他设备或网络连接来验证问题是否出在网络方面。防火墙设置:确保防火墙没有阻止数据库连接。可以尝试临时禁用防火墙,或添加相应的规则来…

收藏:加不加「/」?Nginx location 路径与 proxy_pass 的规律

从一张梗图开始 起源于在 TG 某个频道看到的一张图:图下面的评价是:Nginx is so hard! 实际上这张图描述的是 nginx location 的路径配置,及 location 代码块中 proxy_pass 的路径关系,属于 nginx 应用中路径转发的知识。例如图中 Case 1 对应的代码块应该为:location /te…

直接通过修改二进制文件OpenSSH和OpenSSL的版本为最高版版本来达到形式主义等保要求的操作

文章开头的解释和说明本篇文章是通过形式上修改二进制文件中的版本号来达到某些像行尸走肉机器人类形式主义要求的等保标准要求,来完成其要求的“安全加固”。 我先吐槽一下,这些形式主义等保标准要求,只按照版本号比对来确定是否为最版本的检测逻辑来批量扫描,扫描出来的漏…

Nuxt Kit 使用日志记录工具

title: Nuxt Kit 使用日志记录工具 date: 2024/9/23 updated: 2024/9/23 author: cmdragon excerpt: 摘要:本文介绍在Nuxt 3框架的Nuxt Kit中使用日志记录工具的方法,重点讲解useLogger函数的应用,通过创建示例项目一步步展示如何配置和使用日志记录功能来监控应用状态、记…

CentOS限制物理内存大小方法

编辑/etc/sysconfig/grub在GRUB_CMDLINE_LINUX这行添加mem=1024M注释:配置是限制操作系统可用内存为1G。改后重启查看 作者:杨灏 出处:http://www.cnblogs.com/HByang/