Go语言之——spf13/cobra(命令行应用程序构建)

关于cobra

定义:cobra 库是 golang 的一个开源第三方库,能够快速便捷的建立命令行应用程序
      cobra 是一个命令行程序库,可以用来编写命令行程序。同时,它提供了一个脚手架,用于生成基于 cobra 的应用程序框架。非常多的知名开源项目都使用 cobra库 来构建命令行,如:Kubernetes、Hugo、etcd 等;
优势:cobra 可以快速建立CLI程序,使我们更专注于命令需要处理的具体的业务逻辑

cobra 由三部分构成:commands、arguments 和 flags;
commands:表示要执行的动作。每一个command 表示一个应用程序的一个动作,每个命令可以包含子命令;
arguments:给动作传入的参数;
flags:表示动作的行为。flags 可以包含两种:对所有命令生效(全局flag) 和 对某个命令生效(局部flag);

// 设置全局flag
rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output")
 
// 设置局部flag
localCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from")

1、全局flag
即:该 flag 对所有命令生效,需要在 root.go 文件中创建一个变量来存储该 flag 值。

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

2、局部flag
即:让一个 flag 对且只对某个命令生效,需要在该命令文件中创建一个变量存储该 flag 值:

.定义变量sunsine  
var sunshine string
  
  
2.在version.go的init函数中添加flag  
versionCmd.Flags().StringVarP(&sunshine, "sunshine", "s", "false", "you are my sunshine")
versionCmd.MarkFlagRequired("sunshine")  // 默认情况下,flag是optional(选填),若flag为必填,则需要做该设置
 
 
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

安装cobra

Refer:https://github.com/spf13/cobra#installing

1、安装cobra库

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

在使用时,引入以下的包即可:

import "github.com/spf13/cobra"

1、安装相应的命令行工具:cobra-cli

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

可以使用该命令行工具生成对应的 cobra应用程序。

使用cobra来构建一个命令行工具

1、创建一个应用名为 security-service-v1 的应用程序,并添加根命令:seccore(每个 cobra 程序都有一个根命令)
   最终的程序启动命令:./bin/seccore secserve --config ./conf/seccore/config.yml --http_port 8080
   其中:seccore 为根命令 // 表示安全核心服务(每个 cobra 程序都有一个根命令,可以给根命令添加任意多个子命令)
         secserve 为子命令 // 表示安全服务器
         --config 为flag(这里设置为全局flag,即对所有命令都生效)
         --http_port 为局部flag(即只对 子命令secserve 起作用)
2、添加子命令
3、添加 flag
   3.1、添加 全局flag
   3.2、添加 局部flag

C02CX26SMD6T:security-service-v1 dlz$ pwd
/Users/dlz/work/go_test/security-service-v1
C02CX26SMD6T:security-service-v1 dlz$ go mod init security-service-v1
go: creating new go.mod: module security-service-v1
C02CX26SMD6T:security-service-v1 dlz$ ls
go.mod
 
C02CX26SMD6T:security-service-v1 dlz$ mkdir cmd
C02CX26SMD6T:security-service-v1 dlz$ ls
cmd    go.mod
C02CX26SMD6T:security-service-v1 dlz$ cd cmd/
C02CX26SMD6T:cmd dlz$ mkdir seccore
C02CX26SMD6T:cmd dlz$ ls
seccore
 
 
// 1、添加主命令:seccore (commands表示要执行的动作,这里表示安全核心服务)
C02CX26SMD6T:testservice dlz$ pwd
/Users/dlz/work/go_test/security-service-v1/cmd/seccore
C02CX26SMD6T:testservice dlz$ cobra-cli init .                             // here
Your Cobra application is ready at
/Users/dlz/work/go_test/security-service-v1/cmd/seccore
C02CX26SMD6T:testservice dlz$ tree
.
|____cmd
| |____root.go
|____LICENSE
|____main.go
C02CX26SMD6T:seccore dlz$ go build
C02CX26SMD6T:seccore dlz$ ls
LICENSE cmd     main.go seccore
C02CX26SMD6T:seccore dlz$ ./seccore
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.
 
 
// 2、添加子命令:secserve (commands表示要执行的动作,表示启动一个serve,这里可以是http serve,也可以是其他各种serve,如:rpc serve等)
C02CX26SMD6T:seccore dlz$ pwd
/Users/dlz/work/go_test/security-service-v1/cmd/seccore
C02CX26SMD6T:seccore dlz$ cobra-cli add serve                              // here
serve created at /Users/dlz/work/go_test/security-service-v1/cmd/seccore
C02CX26SMD6T:seccore dlz$ tree
.
|____cmd
| |____secserve.go
| |____root.go
|____LICENSE
|____main.go
|____seccore
C02CX26SMD6T:seccore dlz$ go build
C02CX26SMD6T:seccore dlz$ ./seccore
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.
 
Usage:
  seccore [command]
 
Available Commands:
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  secserve       A brief description of your command
 
Flags:
  -h, --help     help for seccore
  -t, --toggle   Help message for toggle
 
Use "seccore [command] --help" for more information about a command.
C02CX26SMD6T:seccore dlz$ ./seccore serve
secserve called 
 
 
// 3、添加全局 flag:--config
即在 root.go 中添加:
var cfgFile string
 
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/.seccore.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")
}
 
 
// 4、添加局部 flag:--http_port
即在 secserve.go 中添加:
var http_port string
 
func init() {
    rootCmd.AddCommand(secserveCmd)
 
    // Here you will define your flags and configuration settings.
 
    // Cobra supports Persistent Flags which will work for this command
    // and all subcommands, e.g.:
    // secserveCmd.PersistentFlags().String("foo", "", "A help for foo")
    secserveCmd.Flags().StringVarP(&http_port, "http_port", "p", "false", "port for http serve")
    secserveCmd.MarkFlagRequired("http_port")  // 默认情况下,flag是optional(选填),若flag为必填,则需要做该设置
 
    // Cobra supports local flags which will only run when this command
    // is called directly, e.g.:
    // secserveCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

Refer

1、https://github.com/spf13/cobra
2、go cobra实例讲解
3、Go 每日一库之 cobra
4、cobra 简介

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值