Golang框架:cobra

简介: 这些都是命令,二前面的ls、git、gcc等都是我们写的程序。如果不使用 cobra 框架进行编写这些命令,那么程序写起来是相当费劲的。

〇、前言

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

ls -a
git add .
gcc a.c -o app
...

这些都是命令,二前面的ls、git、gcc等都是我们写的程序。如果不使用 cobra 框架进行编写这些命令,那么程序写起来是相当费劲的。

一、基本概念

cobra由三部分构成:commands,arguments 和 flags:

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

  • arguments:给动作传入的参数。

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

比如:./app echo time helloword -t 4中,app 就是程序,echo 就是子命令,timeecho 的子命令,helloword 是传入的参数,-t 是则是 flags

二、一个例子

这个例子的目录结构如下:

▾ protest/
__
▾ cmd/
__echo.go
__print.go
__times.go
__root.go
main.go

(一)root.go

package cmd

import "github.com/spf13/cobra"

var rootCmd = &cobra.Command{
   
    Use: "app [command]",
}

func Execute() {
   
    rootCmd.Execute()
}

(二)print.go

package cmd

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

var cmdPrint = &cobra.Command{
   
    Use:   "Print [string to print]",
    Short: "Print anything to the screen",
    Long: `print is for printing anything back to the screen.
For many years people have printed back to the screen.`,
    Args: cobra.MinimumNArgs(1),
    Run: func(cmd *cobra.Command, args []string) {
   
        fmt.Println("Print: " + strings.Join(args, " "))
    },
}

func init() {
   
    rootCmd.AddCommand(cmdPrint)
}

(三)echo.go

package cmd

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

var cmdEcho = &cobra.Command{
   
    Use:   "echo [string to echo]",
    Short: "Echo anything to the screen",
    Long: `echo is for echoing anything back.
Echo works a lot like print, except it has a child command.`,
    Args: cobra.MinimumNArgs(1),
    Run: func(cmd *cobra.Command, args []string) {
   
        fmt.Println("Print: " + strings.Join(args, " "))
    },
}

func init() {
   
    rootCmd.AddCommand(cmdEcho)
}

(四)times.go

package cmd

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

var echoTimes int
var cmdTimes = &cobra.Command{
   
    Use:   "time [# times] [string to echo]",
    Short: "Echo anything to the screen more times",
    Long: `echo things multiple times back to the user y providing
        a count and a string.`,
    Args: cobra.MinimumNArgs(1),
    Run: func(cmd *cobra.Command, args []string) {
   
        for i := 0; i < echoTimes; i++ {
   
            fmt.Println("Echo: " + strings.Join(args, " "))
        }
    },
}

func init() {
   
    cmdTimes.Flags().IntVarP(&echoTimes, "times", "t", 1, "times to echo the input")
    cmdEcho.AddCommand(cmdTimes)
}

(五)main.go

main.go的作用就是初始化:

package main

import "projects_20/pro_1_example/cmd"

func main() {
   
    cmd.Execute()
}

(六)编译以及使用

键入:go build -o app,就可以得到一个 名为app 的命令行应用程序。

cobra帮我们生成了很棒的 help 信息:

(base) ***@shenjian pro_1_example % ./app -h
Usage:
  app [command]

Available Commands:
  Print       Print anything to the screen
  completion  Generate the autocompletion script for the specified shell
  echo        Echo anything to the screen
  help        Help about any command

Flags:
  -h, --help   help for app

Use "app [command] --help" for more information about a command.

可以看到Available Commands有四个命令,试试 echo 这个命令:

(base) ***@shenjian pro_1_example % ./app echo -h
echo is for echoing anything back.
Echo works a lot like print, except it has a child command.

Usage:
  app echo [string to echo] [flags]
  app echo [command]

Available Commands:
  time        Echo anything to the screen more times

Flags:
  -h, --help   help for echo

Use "app echo [command] --help" for more information about a command.

可以看到Usage 选项有两个方法,而且里面还有一个子命令 time。看看 time 是怎么使用的:

(base) luliang@shenjian pro_1_example % ./app echo time -h
echo things multiple times back to the user y providing
                a count and a string.

Usage:
  app echo time [# times] [string to echo] [flags]

Flags:
  -h, --help        help for time
  -t, --times int   times to echo the input (default 1)

这个 Usage 就是用法,试试:

(base) ***@shenjian pro_1_example % ./app echo time helloworld -t 6
Echo: helloworld
Echo: helloworld
Echo: helloworld
Echo: helloworld
Echo: helloworld
Echo: helloworld

可以看到命令正常使用,太棒了!

三、使用标志

标志提供修饰符以控制命令的操作方式。由于标志是在不同位置定义和使用的,我们需要在外部定义一个具有正确作用域的变量,以分配要使用的标志。

全局标志:

rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "verbose output")

局部标志:

localCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from")

全文完,感谢阅读。

目录
相关文章
|
6月前
|
SQL 关系型数据库 MySQL
探索Gorm - Golang流行的数据库ORM框架
探索Gorm - Golang流行的数据库ORM框架
|
5月前
|
负载均衡 监控 Go
使用Golang框架构建分布式系统
本文探讨了使用Golang构建分布式系统的方法。Golang因其高效、简洁的语法和并发支持成为理想的开发语言。文中列举了几个常用的Golang框架,如Echo、Gin、gRPC和NATS等,并强调了服务拆分、通信机制、负载均衡等构建分布式系统的关键要素。通过选择合适的框架,遵循需求分析、技术选型、服务设计等步骤,开发者可以构建出高性能、高可用和可扩展的系统。此外,文中还提供了一个使用gRPC和etcd的简单代码案例来说明实现过程。
258 4
|
3月前
|
关系型数据库 API Go
[golang]在Gin框架中使用JWT鉴权
[golang]在Gin框架中使用JWT鉴权
104 0
|
3月前
|
网络协议 Go
[golang]gin框架接收websocket通信
[golang]gin框架接收websocket通信
100 0
|
6月前
|
存储 测试技术 Go
Golang框架实战-KisFlow流式计算框架(2)-项目构建/基础模块-(上)
KisFlow项目源码位于&lt;https://github.com/aceld/kis-flow,初始阶段涉及项目构建和基础模块定义。首先在GitHub创建仓库,克隆到本地。项目目录包括`common/`, `example/`, `function/`, `conn/`, `config/`, `flow/`, 和 `kis/`。`go.mod`用于包管理,`KisLogger`接口定义了日志功能,提供不同级别的日志方法。默认日志对象`kisDefaultLogger`打印到标准输出。
663 6
Golang框架实战-KisFlow流式计算框架(2)-项目构建/基础模块-(上)
|
Go API 开发者
Golang Websocket框架:实时通信的新选择
Golang Websocket框架:实时通信的新选择
|
6月前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
233 1
|
6月前
|
XML JSON 人工智能
探索Gin框架:Golang Gin框架请求参数的获取
探索Gin框架:Golang Gin框架请求参数的获取
|
6月前
|
存储 中间件 Go
探索Gin框架:快速构建高性能的Golang Web应用
探索Gin框架:快速构建高性能的Golang Web应用
|
SQL 关系型数据库 Go
Golang ORM框架介绍及比较
Golang ORM框架介绍及比较