最近想用 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.
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 聊聊, 查看更多联系方式