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项目地址


相关文章
|
3月前
|
Shell Linux Go
酷玩Go命令行工具—Cobra
酷玩Go命令行工具—Cobra
39 0
|
6月前
|
存储 JSON Go
Go 命令行框架: 构建强大的命令行工具
Go 命令行框架: 构建强大的命令行工具
|
11月前
|
Kubernetes Unix Shell
Go 语言现代命令行框架 Cobra 详解
Go 语言现代命令行框架 Cobra 详解
856 0
|
Kubernetes NoSQL Go
Go 优秀库推荐 - 命令行工具 cobra
spf13/cobra 和 urfave/cli 是Go的2个优秀命令行工具:
692 0
Go 优秀库推荐 - 命令行工具 cobra
|
Kubernetes 数据可视化 Java
酷玩Go命令行工具—Cobra
酷玩Go命令行工具—Cobra
|
IDE Java Linux
一个小时学会用 Go 编写命令行工具
一个小时学会用 Go 编写命令行工具
|
数据可视化 NoSQL 安全
Go实战之常用命令行工具(下)
Go实战之常用命令行工具
222 0
Go实战之常用命令行工具(下)
|
存储 缓存 JSON
Go实战之常用命令行工具(中)
Go实战之常用命令行工具
139 0
Go实战之常用命令行工具(中)
|
20小时前
|
存储 缓存 安全
Golang深入浅出之-Go语言中的并发安全容器:sync.Map与sync.Pool
Go语言中的`sync.Map`和`sync.Pool`是并发安全的容器。`sync.Map`提供并发安全的键值对存储,适合快速读取和少写入的情况。注意不要直接遍历Map,应使用`Range`方法。`sync.Pool`是对象池,用于缓存可重用对象,减少内存分配。使用时需注意对象生命周期管理和容量控制。在多goroutine环境下,这两个容器能提高性能和稳定性,但需根据场景谨慎使用,避免不当操作导致的问题。
14 4
|
21小时前
|
安全 Go 开发者
Golang深入浅出之-Go语言中的CSP模型:深入理解并发哲学
【5月更文挑战第2天】Go语言的并发编程基于CSP模型,强调通过通信共享内存。核心概念是goroutines(轻量级线程)和channels(用于goroutines间安全数据传输)。常见问题包括数据竞争、死锁和goroutine管理。避免策略包括使用同步原语、复用channel和控制并发。示例展示了如何使用channel和`sync.WaitGroup`避免死锁。理解并发原则和正确应用CSP模型是编写高效安全并发程序的关键。
18 4