热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GoCobra命令行工具入门教程

本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和GithubCLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的AdminCLI。文章还通过一个简单的demo演示了Cobra的使用方法。

简介

Github:https://github.com/spf13/

cobraStar:26.5K

Cobra是一个用Go语言实现的命令行工具。并且现在正在被很多项目使用,例如:Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速的创建命令行工具,特别适合写测试脚本,各种服务的Admin CLI等。比如 Mattermost 项目,就写了很多 Admin CLI:

为什么需要cobra

我们看一个简单的demo使用前

package main
import (
"flag"
"fmt"
)
func main() {
flag.Parse()
args := flag.Args()
if len(args) <= 0 {
fmt.Println("Usage: admin-cli [command]")
return
}
switch args[0] {
case "help":
// ...
case "export":
//...
if len(args) == 3 { // 导出到文件
// todo
} else if len(args) == 2 { // 导出...
// todo
}
default:
//...
}
}

使用后

package main
import (
"fmt"
"github.com/spf13/cobra"
"os"
)
// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
Use: "api",
Short: "A brief description of your application",
Long: `A longer description `,
}
// 命令一
var mockMsgCmd = &cobra.Command{
Use: "mockMsg",
Short: "批量发送测试文本消息",
Long: ``,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("mockMsg called")
},
}
// 命令二
var exportCmd = &cobra.Command{
Use: "export",
Short: "导出数据",
Long: ``,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("export called")
},
}
func Execute() {
err := rootCmd.Execute()
if err != nil {
os.Exit(1)
}
}
func init() {
rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
rootCmd.AddCommand(mockMsgCmd)
rootCmd.AddCommand(exportCmd)
exportCmd.Flags().StringP("out", "k", "./backup", "导出路径")
}
func main() {
Execute()
}

运行:

$ go run main.go
A longer description
Usage:
api [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
export 导出数据
help Help about any command
mockMsg 批量发送测试文本消息
Flags:
-h, --help help for api
-t, --toggle Help message for toggle
Use "api [command] --help" for more information about a command.

发现了吗?你不用再处理各种参数组合了,从此释放了出来,只需要写自己的业务逻辑即可!

基本概念

Cobra由三部分组成:


  • 命令(Commands ):代表行为。命令是程序的中心点,程序的每个功能都应该可以通过命令进行交互,一个命令可以有任意个子命令。

  • 参数(Args):命令的参数

  • 标志(Flags):修饰命令。它修饰命令该如何完成。

官方推荐命令格式为:

$ ./appName command args --Flag

如 hugo server --port=1313 :


  • appName: hugo 

  • command: server 

  • flag: port

安装

Go pkg

添加依赖

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

导入即可:

import "github.com/spf13/cobra"

命令行工具

建议安装命令行工具 `cobra-cli` ,以方便快速创建cobra项目,增加command等。

# 命令行工具
$ go install github.com/spf13/cobra-cli@latest

安装完成之后,执行 `cobra-cli --help` (请确保GOBIN已配置),输出下列信息则代表成功:

$ cobra-cli --help
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.
Usage:
cobra-cli [command]
Available Commands:
add Add a command to a Cobra Application
completion Generate the autocompletion script for the specified shell
help Help about any command
init Initialize a Cobra Application
Flags:
-a, --author string author name for copyright attribution (default "YOUR NAME")
--config string config file (default is $HOME/.cobra.yaml)
-h, --help help for cobra-cli
-l, --license string name of license for the project
--viper use Viper for configuration
Use "cobra-cli [command] --help" for more information about a command.

  

入门实践

新建cobra命令行程序

安装了cobra-cli工具之后,执行 init 初始化创建项目:

$ cobra-cli init

此时,在当前目录自动生成如下文件:

├── LICENSE
├── cmd
│ └── root.go
└── main.go

main.go:

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


root.go(有删减):


package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
Use: "api",
Short: "A brief description of your application",
Long: `A longer description `,
//Run: func(cmd *cobra.Command, args []string) {
// fmt.Println("api called")
//},
}
// 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() {
// 全局flag
// rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.api.yaml)")
// local flag,暂不知道用处
rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

此时运行,不用指定参数,会执行rootCmd,打印使用说明:

$ go build
$ ./api

输出:

A longer description
Usage:
  api [command]
Available Commands:
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
Flags:
  -h, --help     help for api
  -t, --toggle   Help message for toggle
Use "api [command] --help" for more information about a command.  

命令构成

分析上面的默认输出:


  • Available Commands:代表可以执行的命令。比如./api connect

  • Flags:是参数。比如./api connect --ip=127.0.0.1:6379,--ip就是flag,127.0.0.1:6379就是flag的值。

新增命令

我们来新增一个命令试试,这也是命令行程序的魅力,通过不同的参数执行不同的动作。

语法:

$ cobra-cli add [command]

比如:

$ cobra-cli add mock-msg
mockMsg created at /Users/xxx/repo/tools/api

此时,在cmd下会多一个文件(mock_msg.go),内容如下:

package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var mockMsgCmd = &cobra.Command{
Use: "mockMsg",
Short: "A brief description of your command",
Long: `mock msg command`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("mockMsg called")
},
}
func init() {
rootCmd.AddCommand(mockMsgCmd)
}

再执行rootCmd:

$ go build
$ ./api

会发现,多了一个命令:

// ...
Available Commands:
completion Generate the autocompletion script for the specified shell
help Help about any command
mockMsg A brief description of your command
// ...

执行mocMsg命令:

$ ./api mockMsg
mockMsg called

此时,就可以在生成的mock_msg.go:Run() 函数中,放你自己的业务逻辑代码了。

如何显示自己的命令用法

上面新增了一个命令mockMsg,通过 ./api help 打印了命令和help,但是 `Use` 里面指定的内容打印到哪里去了呢?这个时候,需要针对Command在指定help,此时就能打印这个命令的具体用法了。

./api mockMsg help
批量生产mq消息
Usage:
benchmark mockmsg [flags]
Flags:
-g, --goroutine int32 并发routine数量 (default 1)
-h, --help help for mockmsg
-p, --packet int32 每个routine一秒写入mq的数量 (default 20)


-g和-p是新增的2个flag:

func init() {
mockmsgCmd.Flags().Int32P("goroutine", "g", 1, "并发routine数量")
mockmsgCmd.Flags().Int32P("packet", "p", 20, "每个routine一秒写入mq的数量")
rootCmd.AddCommand(mockmsgCmd)
}

获取这2个值:

// mockmsgCmd represents the mockmsg command
var mockmsgCmd = &cobra.Command{
Use: "mockmsg",
Short: "批量生产mq消息",
Run: func(cmd *cobra.Command, args []string) {
// 这里要写全名
g, _ := cmd.Flags().GetInt32("goroutine")
p, _ := cmd.Flags().GetInt32("packet")
fmt.Println("mockmsg called,flags:g=", g, ",p=", p, ",args:", args)
},
}

执行:

$ go run main.go mockmsg -p 322 -g 5 args1 args2
mockmsg called,flags:g= 5 ,p= 322 ,args: [args1 args2]

总结

我们通过一个例子,介绍了使用cobra带来的好处。通过一个完整的入门实践,演示了创建项目、添加命令和使用的一些示例,希望对你有所帮助!

参考:

https://blog.csdn.net/qq_31639829/article/details/118889580

https://github.com/mattermost/mattermost-server


推荐阅读
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 尽管Medium是一个优秀的发布平台,但在其之外拥有自己的博客仍然非常重要。这不仅提供了另一个与读者互动的渠道,还能确保您的内容安全。本文将介绍如何使用Bash脚本将Medium文章迁移到个人博客。 ... [详细]
  • 本文详细介绍了在 Red Hat Linux 系统上安装 GCC 4.4.2 的步骤,包括必要的依赖库的安装及常见问题的解决方法。 ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
  • 本文档介绍了如何使用ESP32开发板在STA模式下实现与TCP服务器的通信,包括环境搭建、代码解析及实验步骤。 ... [详细]
  • 从键盘输入年、月、日,要求输出当前日期为当年的第多少天。今天凯凯君又去参加了笔试,碰到了这样一个题目,从键盘输入年、月、日,要求输出当前日期为当年的第多少天。面对这个题目你首先想到 ... [详细]
  • 本文详细介绍了 Java 中 org.w3c.dom.Node 类的 isEqualNode() 方法的功能、参数及返回值,并通过多个实际代码示例来展示其具体应用。此方法用于检测两个节点是否相等,而不仅仅是判断它们是否为同一个对象。 ... [详细]
  • 高效的JavaScript异步资源加载解决方案
    本文探讨了如何通过异步加载技术处理网页中大型第三方插件的加载问题,避免将大文件打包进主JS文件中导致的加载时间过长,介绍了实现异步加载的具体方法及其优化。 ... [详细]
  • 本文详细介绍如何在华为鲲鹏平台上构建和使用适配ARM架构的Redis Docker镜像,解决常见错误并提供优化建议。 ... [详细]
  • 编译原理中的语法分析方法探讨
    本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ... [详细]
  • 探讨如何在Oracle数据库中实现用户注册表单的多地址功能,包括设置默认地址的方法。 ... [详细]
  • Linux环境下MySQL的安装与配置
    本文详细介绍了在Linux系统上安装和配置MySQL的步骤,包括安装前的准备工作、下载和解压安装包、初始化数据库、配置文件编辑、启动服务以及设置开机自启动等。 ... [详细]
author-avatar
php
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有