Bonzai以及如何创建个人CLI来统治所有人
#go #cli #bonzai

我认为,精心设计且高效的命令行界面(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命令和help软件包作为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的真正力量:

  1. go install ./cmd/yourproject一起安装二进制文件以在PATH上提供它
  2. 配置完成

免责声明:这是假设您已经在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语言非常适合的简单力量!