什么是 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)
常见的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是一个可以创建强大的CLI应用程序的一个库,cobra可以用来生成一个支持使用命令控制的程序。
cobra被用在了许多Go开发的程序,比如Kubernetes, Hugo 和 Github CLI 等程序。
cobra提供的功能:
- 简单易用的基于子程序的CLI,比如
app server
、app 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生成应用程序框架
- 在要生成代码的目录下运行(要把程序生成在
./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
通过这个变量,定义了一个新的命令,这个命令里有四个
.
.
.
.
.
.
.