使用urfave/cli实现命令行备忘录
🍕前言
本周抽空了解了一下go的工具包:github.com/urfave/cli还是挺有意思的;
于是就写了一个基于github.com/urfave/cli包的简单命令行备忘录demo;
功能很简单,代码也并不是很复杂,当作入门来看还是很不错的;
当然,学这些工具并不是就是为了去实现一个简单备忘录,在这个学习的过程中能了解到很多新鲜的东西亦能拓宽我们的视野,比如说,知道了黑窗口中各种命令究竟是如何去实现的,为什么go语言适合去制作这种命令行工具,shell脚本如何去实现的,docker,数据库命令,git等等的命令原理,这有助于我们对计算机整体知识和底层的理解;
话不多说,我们进入正题;
🍔urfave/cli入🚪
github.com/urfave/cli包的介绍
github.com/urfave/cli
是一个 Go 语言的命令行应用程序开发包。它提供了一组简单且功能强大的工具,用于构建命令行界面的应用程序,包括解析命令行参数、定义命令和子命令、显示帮助信息等功能。
具体来说,github.com/urfave/cli
包的主要功能包括:
- 解析命令行参数: 可以方便地解析命令行中的选项和参数,并将它们映射到相应的数据结构中。
- 定义命令和子命令: 可以定义主命令以及其对应的子命令,使得命令行应用程序可以拥有层次结构和多个操作选项。
- 显示帮助信息: 自动生成并显示命令行应用程序的帮助信息,包括命令、选项、参数的说明和用法示例等。
- 处理命令执行: 可以将函数与特定的命令关联起来,当用户输入相应的命令时,执行相应的函数逻辑。
- 处理错误和异常情况: 可以定义自定义的错误处理逻辑,以及处理未知命令和参数错误的方式。
入门程序介绍
package main
import (
"fmt"
"log"
"os"
"github.com/urfave/cli"
)
func main() {
// 创建一个新的命令行应用程序
app := cli.NewApp()
// 设置应用程序的名称、版本和简要描述
app.Name = "MyCLI"
app.Version = "1.0.0"
app.Usage = "A simple command-line application"
// 定义一个命令
app.Commands = []cli.Command{
{
Name: "greet", //命令触发词:greet
Aliases: []string{
"g"}, //简写:g
Usage: "Greet someone",
Action: greet,
Flags: []cli.Flag{
cli.StringFlag{
Name: "name, n",
Value: "World",
Usage: "Name of the person to greet",
},
},
},
}
// 运行命令行应用程序
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
}
// greet 函数用于执行 greet 命令的逻辑
func greet(c *cli.Context) error {
name := c.String("name")
fmt.Printf("Hello, %s!\n", name)
return nil
}
这段代码意思是:
定义了一个名为 “MyCLI” 的命令行应用程序,它包含一个命令 “greet”,用于向某人打招呼。命令 “greet” 可以通过
greet
或g
触发,并接受一个名为 “name” 的选项,用于指定要打招呼的人的姓名。如果用户没有提供姓名,则默认使用 “World”。当用户执行命令
./MyCLI greet
时,默认会输出 “Hello, World!”。如果用户执行命令./MyCLI greet --name Alice
,则会输出 “Hello, Alice!”。
其实整个cli项目框架就是:
1.初始化命令行程序,定义版本等等信息;
2.定义各种命令(包括触发关键词,命令报错,命令方法的调用等)
3.写各种命令的详细代码实现;
ok;相信你已经对这个包的基础使用已经有了一部分的了解;
现在就引入备忘录工具的实现;
🍟备忘录具体代码讲解
先看项目的分层:
各文件的含义:
- commands文件存储命令的具体实现代码
- memo为可执行文件
- memo.go为项目入口,也包含了命令说明及调用
- memos.txt存储备忘录中的数据
memo
按照刚刚讲的初始化会放在:memo.go文件中:确实如此:
package main
import (
"github.com/urfave/cli"
"log"
"os"
"time"
)
// Memo represents a memo item
type Memo struct {
ID int
Text string
CreatedAt time.Time
ModifiedAt time.Time
}
var memos []Memo
var lastID int
func main() {
loadMemos() // 加载备忘录数据
app := cli.NewApp() //初始化app类型数据
app.Name = "Memo"
app.Usage = "A simple command-line memo application"
app.Version = "1.0.0"
app.Commands = []cli.Command{
{
Name: "add",
Aliases: []string{
"a"},
Usage: "Add a new memo",
Action: addMemo,
},
{
Name: "list",
Aliases: []string{
"l"},
Usage: "List all memos",
Action: listMemos,
},
{
Name: "delete",
Aliases: []string