golang 快速开发命令行工具的神器 cobra & cobra cli

更新日期: 2024-11-19 阅读次数: 340 字数: 1119 分类: golang

最近想用 go 开发一个自动生成 gin CRUD 前后端代码的命令行工具,实现跟 python django 类似的快速搭建 admin 后台的体验。 于是找了一个类似的脚手架工具 nunu,但是这个项目的代码组织风格并不是我喜欢的类型,且没有 ant design 前端相关的模板,所以我打算自己重造这个轮子。动手之前,我粗略浏览了一遍 nunu 这个项目的代码,发现里面使用了 cobra 这个库,非常便捷。

在参加烟台八角湾数字经济大会时,边开发,边整理了这篇文档。倪光南院士在上面大讲 AI,我在下面写 CRUD。。。我们都有美好的未来 🥲

cobra 是什么

如果经常需要用 golang 给自己开发一些本地的命令行工具,cobra && cobra-cli 能非常高效的初始化项目,使代码更清晰。

Cobra provides its own program that will create your application and add any commands you want. It's the easiest way to incorporate Cobra into your application.

golang 快速开发命令行工具的神器 cobra & cobra cli

cobra 是眼镜蛇的英文。😱

安装 cobra-cli

> go install github.com/spf13/cobra-cli@latest
go: downloading github.com/spf13/cobra-cli v1.3.0
go: downloading github.com/spf13/cobra v1.3.0
go: downloading golang.org/x/sys v0.0.0-20211210111614-af8b64212486

> which cobra-cli
/home/zhongwei/golang/bin/cobra-cli

使用 cobra-cli 新建项目, 方式一

从头新建一个项目:

cobra-cli init [app]

使用 cobra-cli 新建项目, 方式二

如果项目已存在,例如,已经通过下面命令创建了项目:

mkdir myapp
cd myapp
go mod init github.com/spf13/myapp

可以通过 cobar-cli 自动创建代码脚手架

cobra-cli init

注意:如果之前已经存在了 main.go, 则 cobra-cli 会自动覆盖该文件。

目录结构

> tree
.
├── LICENSE
├── cmd
│   └── root.go
├── go.mod
├── go.sum
└── main.go

All commands have a default parent of rootCmd if not specified.

root.go 中,是所有命令的父级命令。

main.go

以下是 cobra-cli 自动生成的代码:

> cat main.go
/*
Copyright © 2024 NAME HERE <EMAIL ADDRESS>

*/
package main

import "go_snip/cmd"

func main() {
        cmd.Execute()
}

新建一个命令

例如,我想新建一个命令,用来解析 golang gin 项目中的 model 文件中定义的 struct 结构体。 自动生成:

  • 数据库的 CRUD controller API 代码
  • route 代码
  • 前端的 ant design pro 的列表页,及编辑&创建页代码
  • SQL 建表语句

这样就能快速的完成一些搬砖类的敲代码工作。

对应的 cobra-cli 命令:

> cobra-cli add ginCrud
ginCrud created at /mnt/d/work/go_snip

注意:

Note: Use camelCase (not snake_case/kebab-case) for command names. Otherwise, you will encounter errors. For example, cobra-cli add add-user is incorrect, but cobra-cli add addUser is valid.

命令名,需要使用驼峰式写法,不能使用下划线分割的形式。

执行命令之后,会看到 cmd 目录下新增了一个 ginCrud.go 的文件。

> ls cmd/
ginCrud.go*  root.go*

新命令的代码结构

package cmd

import (
	"fmt"

	"github.com/spf13/cobra"
)

// ginCrudCmd represents the ginCrud command
var ginCrudCmd = &cobra.Command{
	Use:   "ginCrud",
	Short: "基于 model 新建 gin & antd pro CRUD 代码",
	Long: `自动解析 model 文件中的 struct 结构体代码。生成:
- gin CRUD api
- route config
- antd pro page & api
- create SQL for DB
`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("ginCrud called")
	},
}

func init() {
	rootCmd.AddCommand(ginCrudCmd)
}

执行新命令

> go run main.go ginCrud
ginCrud called

查看新命令的帮助

实际就是 help + 新命令名称。

> go run main.go help ginCrud

自动解析 model 文件中的 struct 结构体代码。生成:
- gin CRUD api
- route config
- antd pro page & api
- create SQL for DB

Usage:
  go_snip ginCrud [flags]

Flags:
  -h, --help   help for ginCrud

同时,可以在主命令的帮助中看到新的命令 ginCrud 了:

> go run main.go

A longer description that spans multiple lines and likely contains
examples and usage of using your application. 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.

Usage:
  go_snip [command]

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  ginCrud     基于 model 新建 gin & antd pro CRUD 代码
  help        Help about any command

Flags:
  -h, --help     help for go_snip
  -t, --toggle   Help message for toggle

Use "go_snip [command] --help" for more information about a command.

给命令添加参数

例如,在执行 ginCrud 命令时,需要指定 model 文件的路径。

自动提示

从主命令的帮助中,会看到是支持自动补全命令的,非常贴心。

completion Generate the autocompletion script for the specified shell

后续

Golang AST 解析 struct 字段,自动生成 CRUD 代码

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式