Go --- 命令行工具Cobra

简介: Go --- 命令行工具Cobra

Cobra

Cobra既是一个用于创建强大的现代CLI应用程序的库,也是一个用于生成应用程序和命令文件的程序。

简单来讲就是用来写命令的,例如常见的 version ,help,build 啥的

cobra的简单使用

首先是项目结构

▾ appName/
    ▾ cmd/
        root.go
        yourCmd.go
      main.go

下面这个是我的项目结构

在 Cobra 的应用程序中他的main.go文件中就只是用来初始化Corbra的。

下面是main.go文件里的内容

package main
// 这个 pathToYourApp 就是你应用程序的路径
import (
  "{pathToYourApp}/cmd"
)
func main() {
  cmd.Execute()
}

Cobra不需要任何特殊的构造函数。只需创建您的命令。

需要有一个root.go文件在cmd文件中,内容大概如下

package cmd
import (
  "fmt"
  "os"
  "github.com/spf13/cobra"
  "github.com/spf13/viper"
)
var (
  // 使用的标志
  cfgFile     string
  userLicense string
  rootCmd = &cobra.Command{
    Use:   "cobra",
    Short: "A generator for Cobra based Applications",
    Long: `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.`,
  }
)
// 用于执行root
func Execute() error {
  return rootCmd.Execute()
}
// 初始化配置
func init() {
  cobra.OnInitialize(initConfig)
  rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)")
  rootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "author name for copyright attribution")
  rootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "name of license for the project")
  rootCmd.PersistentFlags().Bool("viper", true, "use Viper for configuration")
  viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
  viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper"))
  viper.SetDefault("author", "NAME HERE <EMAIL ADDRESS>")
  viper.SetDefault("license", "apache")
//  rootCmd.AddCommand(addCmd)
//  rootCmd.AddCommand(initCmd)
}
func initConfig() {
  if cfgFile != "" {
    // 使用标签中的配置
    viper.SetConfigFile(cfgFile)
  } else {
    // 在主目录下寻找基础配置
    home, err := os.UserHomeDir()
    cobra.CheckErr(err)
    // 在主目录下找不到 ".cobra" 文件的情况
    viper.AddConfigPath(home)
    viper.SetConfigType("yaml")
    viper.SetConfigName(".cobra")
  }
  viper.AutomaticEnv()
  if err := viper.ReadInConfig(); err == nil {
    fmt.Println("Using config file:", viper.ConfigFileUsed())
  }
}

有了 root.go 后就可以写自己的命令了

就比如说 version 命令,在 cmd 下新建一个一个“version.go”,内容如下

package cmd
import (
   "fmt"
   "github.com/spf13/cobra"
)
func init() {
   rootCmd.AddCommand(versionCmd)
}
var versionCmd = &cobra.Command{
   Use:   "version",
   Short: "Print the version number of Hugo",
   Long:  `All software has versions. This is Hugo's`,
    // 执行该命令时,会执行的函数
   Run: func(cmd *cobra.Command, args []string) {
      fmt.Println("this is test cobra example")
   },
}

接着整理依赖就行了

# 初始化go.mod文件
go mod init
# 整理依赖
go mod vendor

然后构建exe可执行文件

go build main.go

接着测试写的version

# 先查看总的命令
> main
# 然后查看version命令
> main version

结果:

基本的操作会了,然后整点花活

整个server的命令,在cmd文件中创建server.go ,内容如下

package cmd
import (
   "github.com/gin-gonic/gin"
   "github.com/spf13/cobra"
)
func init() {
   rootCmd.AddCommand(serverCmd)
}
var serverCmd = &cobra.Command{
   Use:   "server",
   Short: "Print the version number of Hugo",
   Long:  `All software has versions. This is Hugo's`,
   Run: func(cmd *cobra.Command, args []string) {
      r := gin.Default()
      r.GET("/", func(context *gin.Context) {
         context.JSON(200,gin.H{
            "每一天":"都要开心",
         })
      })
      r.Run()
   },
}

因为需要导入新的依赖,这是我们再进行依赖的整理

go mod vendor

重新构建.exe文件(删除老的main.exe 文件)

> go build main.go

执行server命令

> main server

然后打开浏览器,你便会得到

如果gin无法执行,可能是端口被占用,检查端口后再运行

cobra.Command 常用的参数

  • Use
  • 使用信息
  • Short
  • 'help’输出中显示的简短描述。
  • Long
  • 'help’输出中显示的详细描述。
  • Run: func(cmd *Command, args []string)
  • 通常是实际的功函数。大多数命令只会实现这一点。
  • RunE: func(cmd *Command, args []string) error
  • 和Run一样,但是返回一个error

其余信息建议去看Cobra项目: Cobra项目地址


相关文章
|
4月前
|
Kubernetes 监控 Cloud Native
"解锁K8s新姿势!Cobra+Client-go强强联手,打造你的专属K8s监控神器,让资源优化与性能监控尽在掌握!"
【8月更文挑战第14天】在云原生领域,Kubernetes以出色的扩展性和定制化能力引领潮流。面对独特需求,自定义插件成为必要。本文通过Cobra与Client-go两大利器,打造一款监测特定标签Pods资源使用的K8s插件。Cobra简化CLI开发,Client-go则负责与K8s API交互。从初始化项目到实现查询逻辑,一步步引导你构建个性化工具,开启K8s集群智能化管理之旅。
61 2
|
7月前
|
Shell Linux Go
酷玩Go命令行工具—Cobra
酷玩Go命令行工具—Cobra
98 0
|
存储 JSON Go
Go 命令行框架: 构建强大的命令行工具
Go 命令行框架: 构建强大的命令行工具
|
Kubernetes NoSQL Go
Go 优秀库推荐 - 命令行工具 cobra
spf13/cobra 和 urfave/cli 是Go的2个优秀命令行工具:
755 0
Go 优秀库推荐 - 命令行工具 cobra
|
Kubernetes Unix Shell
Go 语言现代命令行框架 Cobra 详解
Go 语言现代命令行框架 Cobra 详解
1235 0
|
Kubernetes 数据可视化 Java
酷玩Go命令行工具—Cobra
酷玩Go命令行工具—Cobra
|
IDE Java Linux
一个小时学会用 Go 编写命令行工具
一个小时学会用 Go 编写命令行工具
|
数据可视化 NoSQL 安全
Go实战之常用命令行工具(下)
Go实战之常用命令行工具
264 0
Go实战之常用命令行工具(下)
|
存储 缓存 JSON
Go实战之常用命令行工具(中)
Go实战之常用命令行工具
165 0
Go实战之常用命令行工具(中)
|
缓存 关系型数据库 MySQL
Go实战之常用命令行工具(上)
Go实战之常用命令行工具
463 0
Go实战之常用命令行工具(上)