我认为,精心设计且高效的命令行界面(CLI)的一个例子是git
。考虑到其创造的时间,它的命令非常直观和表现力。自从深入研究终端和自动化以来,我经常考虑创建自己的CLI,该CLI充当个人助理,能够持有我开发的所有自动化脚本。令我惊讶的是,我偶然发现了一个名叫rob的很棒的开发人员,他为GO创建了一个了不起的工具,可以做到这一点!以及Golang本身提供的奖励是:“建立一个二进制并随身携带您的到处走动”
在本文中,我将尝试对此框架进行简要介绍,这是有优势的,当然我们会开发一些CLI作为一个例子。
什么是Bonzai
我认为这可以在其自己的documentation上进行更详细的详细说明,但是总结一下Bonzai是GO的框架,可让您使用嵌套命令和Tab Pleastion 默认在命令的每个级别,使用此工具,可以创建命令,例如:
mycli todo add help
此命令将打印出add
命令的帮助信息,而很酷的部分是您可以完成每个部分的选项卡。
免责声明:选项卡完成仅在bash上起作用。
让我们创建一个快速的CLI
学习某件事的最佳方法是这样做的,让我们创建一个快速简单的CLI:
为您的项目创建一个文件夹,然后从go mod init <yourpath>
开始
这是任何GO项目所必需的,您应该熟悉!
安装所需的依赖项
go get -u github.com/rwxrob/bonzai
go get -u github.com/rwxrob/bonzai/z
go get -u github.com/rwxrob/help
免责声明:帮助包本身就是Bonzai分支机构!目的是帮助我们在每个级别上提供文档消息。
在cmd/yourproject/main.go
中创建main.go
文件:
这是一个很好的练习,因此您可以轻松地使用go install ./cmd/yourproject
安装。
您的主文件应该看起来像这样:
package main
func main() {
yourproject.Cmd.Run()
}
很简单吗?接下来是真正的冷静!
将root命令文件定义为cmd.go
此文件将生存在我们项目的根源上,应该看起来像这样:
package yourproject
import (
Z "github.com/rwxrob/bonzai/z"
"github.com/rwxrob/help"
)
var Cmd = &Z.Cmd{
Name: "mycli",
Summary: "A CLI",
Usage: "",
Version: "0.0.1",
Description: "A CLI",
Commands: []*Z.Cmd{help.Cmd},
}
您可以看到,我们正在使用Z
软件包将root命令定义为bonzai的分支,如果要创建一个子命令,您只需要创建另一个&Z.Cmd{}
实例,然后插入父母Commands
的数组,它将自动标记为“可完整”。我认为非常简单而令人惊奇。
使用go run ./cmd/yourproject/main.go
运行我们的项目,您应该有此消息:
NAME
mycli - A CLI
SYNOPSIS
mycli COMMAND
COMMANDS
help - display help similar to man page format
DESCRIPTION
A CLI
这全是因为help
软件包本身就是一个Bonzai分支,您可以轻松地插入主CLI。
如何为此设置选项卡完成(仅bash)
现在我们有一个基本的项目运行,让我们配置您的标签完成,以开始获得Bonzai的真正力量:
- 与
go install ./cmd/yourproject
一起安装二进制文件以在PATH
上提供它 - 配置完成
免责声明:这是假设您已经在shell上配置了bash_completion
在bash上,您只需要在.bashrc
上戴上此行:
complete -C <yourbinary> <yourbinary>
你完成了!您可以开始在CLI上完成所有内容。
创建我们的TODO添加分支命令
现在,我们知道了关于Bonzai的所有基础,让我们结束本文,并使用我们到目前为止所学的所有知识编写我们的todo add
命令。
让我们假设我们以前的文件,并添加更多这样的命令:
package yourproject
import (
"fmt"
Z "github.com/rwxrob/bonzai/z"
"github.com/rwxrob/help"
)
var Cmd = &Z.Cmd{
Name: "mycli",
Summary: "A CLI",
Usage: "",
Version: "0.0.1",
Description: "A CLI",
Commands: []*Z.Cmd{help.Cmd, todoCmd},
}
var todoCmd = &Z.Cmd{
Name: "todo",
Summary: "Task management branch",
Commands: []*Z.Cmd{help.Cmd, todoAddCmd},
}
var todoAddCmd = &Z.Cmd{
Name: "add",
Summary: "Add a task",
Commands: []*Z.Cmd{help.Cmd},
Call: func(z *Z.Cmd, _ ...string) error {
fmt.Println("test")
return nil
},
}
您看到它只是&Z.Cmd
结构的永恒组成吗?这就是使Bonzai如此易于使用的原因。
像以前一样安装此项目并运行yourproject todo add help
(使用Tab完成,因为这是这样做的很酷的方法),您会收到此消息:
NAME
add - Add a task
SYNOPSIS
add [COMMAND]
COMMANDS
help - display help similar to man page format
仅运行yourproject todo add
为您提供了stdout上的test
。
结论
我希望此简介能帮助您使用Bonzai编写下一个CLI,并享受与Golang语言非常适合的简单力量!