Go命令行程序(CLIs)框架——Cobra

什么是 CLIs

命令行界面(英语:Command-Line Interface,缩写:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(character user interface, CUI)。

虽然现在很多操作系统都提供了图形化的操作方式,但是却都保留了命令行界面,甚至有很多系统更加强了这部分功能。例如服务器端常用的Linux系统,目前就连以可视化桌面为主的Windows,也在强化自己命令行操作指令的功能和数量。
常见的CLI:
* bash、sh、ksh(Unix-like系统)
* COMMAND.COM(MS-DOS系统)
* cmd.exe(Windows命令提示符)
* Windows PowerShell(最新Windows NT系统搭载的CLI)

参考——《wikipedia——命令行界面》

常见的CLI程序
git、apt(Debian系系统的软件包管理器)等

CLI程序的结构

执行命令行程序的一般格式为:
APPNAME COMMAND ARG --FLAG
例如:
* git commit -m '简短的提交说明'
其中,git是程序名(APPNAME);commit是行为(COMMAND);-m是命令行选项,即对行为的改变(FLAG),'简短的提交说明'就是命令行的参数(ARG)。
* git clone URL --bare
其中,git是APPNAME;clone是COMMAND;URL是ARG;--bare是FLAG。


cobra

cobra github代码仓库

cobra是一个可以创建强大的CLI应用程序的一个库,cobra可以用来生成一个支持使用命令控制的程序。

cobra被用在了许多Go开发的程序,比如Kubernetes, Hugo 和 Github CLI 等程序。

cobra提供的功能:

  • 简单易用的基于子程序的CLI,比如app serverapp fetch等。
  • 完全兼容POSIX标志(包括短和长版标志)
  • 支持嵌套子命令
  • 支持全局标志、局部标志、和传递标志
  • 可以非常简单地生成应用程序(cobra init appname)和命令(cobra add cmdname
  • 可以智能纠错(输入错误的命令app servr,会提示“did you meanapp server?”)
  • 自动生成有关命令(COMMEND)和标志(FLAG)的帮助
  • 自动识别帮助标志,例如-h--help
  • 可以自动生成bash、zsh、fish、PowerShell的命令补全功能
  • 自动生成该程序的手册
  • 支持命令别名
  • 可以灵活地定义自己的帮助、用法等信息
  • Optional tight integration with viper for 12-factor apps

简要了解了cobra以及它可以提供的功能以后,我们现在安装cobra吧!

安装cobra(导入cobra包)

安装cobra包:

$ go get -u github.com/spf13/cobra/cobra

使用cobra生成应用程序框架

  1. 在要生成代码的目录下运行(要把程序生成在./appname/下,就要在./的目录下运行命令)
$ cobra init [appname] --pkg-name [pkgname]

此时我们就能在目录下看到由框架自动生成的程序啦!
不过在build这个程序之前,还需要初始化一下go mod,随后就能build了:

$ go mod init [moduleName]

如果要添加子命令,那么就在程序目录(./appname/)下运行:

$ cobra add [commandName]

上述命令执行完毕以后,我们再来看一下目录结构:

  ▾ appName/
    ▾ cmd/
        root.go
        your.go
        commands.go
      main.go

这就是一个cobra程序最基础的目录结构。

编写一个最基础的cobra程序!

我们再来看一下我们刚才通过cobra add [commandName]这条命令添加的新程序的代码:

为什么不看通过cobra init [appname] --pkg-name [pkgname]这条命令生成的./cmd/root.go这个代码?
通过init生成的root.go并不是最简单的cobra程序,其中包括了另一个函数initConfig(),以及一些有关于读取cfgFile的内容。这些内容我认为属于进阶的内容。

/*
    作者代码自带的版权信息:略
*/
package cmd

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

// miaoCmd represents the miao command
var miaoCmd = &cobra.Command{
    Use:   "miao",//这里需要写commandName,也就是响应这个操作的命令名。

    Short: "A brief description of your command【关于这条命令的简要说明】",
    Long: `A longer description that spans multiple lines and likely contains examples【一个长的说明,并且你可以使用跨越多行的文字,就像现在这个现在这个例子一样】
and usage of using your command. 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.【巴拉巴拉巴拉】`,

    Run: func(cmd *cobra.Command, args []string) {//这里定义了如果执行了这条命令,所要运行的函数。
        fmt.Println("miao called")
    },
}

func init() {
    rootCmd.AddCommand(miaoCmd)

    // Here you will define your flags and configuration settings.
    //【在这里,你将定义你自己的flags和配置结构】

    // Cobra supports Persistent Flags which will work for this command
    //【cobra支持全局的flags,这个flag可以在这条命令,还有它的子命令中被使用】
    // and all subcommands, e.g.:
    miaoCmd.PersistentFlags().String("foo", "", "A help for foo")


    // Cobra supports local flags which will only run when this command
    //【cobra支持局部flags,这类flags只在你运行这条命令的时候被运行。且它会立刻被执行】
    // is called directly, e.g.:
    miaoCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

从生成代码的结构看,它有几这么几个变量和函数:

1. var miaoCmd = &cobra.Command

通过这个变量,定义了一个新的命令,这个命令里有四个

.
.
.
.
.
.
.

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注