Go语言搬砖 cobra命令行工具包

1,279 阅读2分钟

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」。

简介

cobra是大佬 spf13 的一个现代化的CLI工具包,业界有名的kubernetes和docker都有使用它作为客户端命令行工具

另外大佬spf13还有其他比较流行的项目,比如配置工具viper,静态网站生成器hugo等

cobra官网: github.com/spf13/cobra

cobra特点

  • 子命令编写简单
  • 支持嵌套子命令
  • 智能建议(语义化识别)
  • 自带帮助标识 -h、--help等
  • 命令和标识等自动生成(需先定义结构)
  • 完全符合POSIX的标志,包括短版和长版
  • 可以自定义帮助,用法等
  • 自动生成命令补全功能

概念

cobra建立在命令、参数和标志的结构上,命令代表动作,参数是事物,标志是这些动作的修饰符

最好的cobra命令行工具在使用时读起来像句子,非常便于理解(模式: appname command arg --flag)

安装

基于go model的方式安装

go get -u github.com/spf13/cobra

在代码中引入

import "github.com/spf13/cobra"

使用

编写第一个demo

此demo中定义了一个子命令print, 将接收到的参数打印出来

package main

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

func main() {

   //定义命令结构
   var cmdPrint = &cobra.Command{
      Use: "print",
      Short: "该命令的简短描述",
      Long: "该命令的详细描述",
      //定义最小参数个数
      Args: cobra.MinimumNArgs(1),
      //命令执行的入口
      Run: func(cmd *cobra.Command, args []string) {
         fmt.Println("print: "+ strings.Join(args,""))
      },
   }
   cmdPrint.Execute()
}

运行会报错,因为结构中声明了最小参数个数 image.png

如果想在代码编辑器中运行,需要编辑配置,设置程序参数 那一行

image.png

image.png

仿docker部分命令的demo

使用cobra编写命令行工具,调用系统上的docker命令进行操作,也可以伪装其他命令

package main

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

func main() {

   var cmdPs = &cobra.Command{
      Use:  "ps",
      Short: "列出容器",
      Run: func(cmd *cobra.Command, args []string) {
         fmt.Println("--------容器列表--------")
         args = []string{"ps"}
         dockerPrint("docker",args)
      },
   }

   var cmdImages = &cobra.Command{
      Use:   "images",
      Short: "列出镜像",
      Run: func(cmd *cobra.Command, args []string) {
         fmt.Println("--------镜像列表--------")
         args = []string{"images"}
         dockerPrint("docker",args)
      },
   }

   var cmdLogs = &cobra.Command{
      Use:   "logs",
      Short: "查看容器日志",
      Args: cobra.MinimumNArgs(1),
      Run: func(cmd *cobra.Command, args []string) {
         fmt.Println("--------查看日志--------")
         args = []string{"logs",strings.Join(args,"")}
         dockerPrint("docker",args)
      },
   }
   
   var rootCmd = &cobra.Command{Use: "docker"}
   rootCmd.AddCommand(cmdPs, cmdImages,cmdLogs)
   rootCmd.Execute()

}

func dockerPrint(docker string,args []string) {
   cmd := exec.Command(docker, args...)
   cmd.Stdout = os.Stdout
   cmd.Stderr = os.Stderr
   
   cmd.Run()
   cmd.Wait()
}

运行后截图

image.png

总结

本文只是简单的实践了一下cobra创建命令行工具,可以发现编写命令行工具非常简单和快速。。

官网比较推荐的方法是使用cobra init直接生成骨架,然后直接写入相关逻辑,感兴趣的伙伴可以看看,传送门: github.com/spf13/cobra…

image.png