大家好 我是寸铁
总结了一篇【Go-Zero】goctl一键生成常用命令的文章✨
喜欢的小伙伴可以点点关注
本文主要是针对最常用的
api
、model
、rpc
代码生成进行描述
其他的代码生成命令可以根据自己的需求在官方文档进行查看
背景:goctl 的最早功能是为了解决 GRPC 内网调试问题,大约是在 2019 年,在我们的生产环境中,rpc 是内网隔离的,不可通过外网访问,为了快速去 mock 一些线上 RPC client 的请求,就简单的实现了第一版本的代码生成,主要目的是去访问 RPC Server 做一些调试。
goctl
是 go-zero
的内置脚手架,是提升开发效率的一大利器,可以一键生成代码、文档、部署 k8s
yaml
、dockerfile
等。
沟通,是团队协作进行信息交换的一种形式,沟通的方式有很多种,会议沟通、文档沟通、聊天交流,相信不管是哪种方式,沟通都是团队中最难的一个环节,会议沟通需要占用大量时间,动则半小时起步,文档沟通同样,也会占据大量时间去构思和编写大篇幅的文档,最后可能还没表达出预期目标,线上聊天,需要双方都在线上才能进行信息交换,当然我们这里沟通交换的信息更多是指开发中的一些内容,如接口信息、部署信息等。
有了沟通,那么团队之间的协作的耦合是避免不了的,例如:在前后端开发中,最大的耦合是接口的耦合,前端完成了规定 UI 绘制后,需要等待后端的接口部署到对应环境才能实现功能的调试,在此期间,前端的团队资源就会大大浪费,由此还会导致项目的延期等问题。
除了沟通成本和团队耦合以外,每个团队在进行项目开发时也有很多时间是在做重复的工作,例如:我们在开发一个新的功能时,需要去定义接口,编写接口文档,编码准备工作,业务开发,model
文件,编写 Dockerfile
文件,编写 k8s yaml
文件,在这些上面我们可以在每个环节上都有提升的空间,让用户将真正的时间集中在业务开发上。
在之前的开发实践中,经常会出现grpc server
实现不完全的问题,grpc server
实现类经常会出现编译不过的情况;除此之外,数据库查询层代码开发,sql
语句的编写多参,少参,参数错位,在编译过程中很难发现,一般可能到 QA 环节才能发现,更甚者会导致线上问题。
goctl这么强大的代码生成工具,下面笔者带你使用起来!
根据 api
文件生成Go HTTP
代码。
goctl api go -api xx.api -dir.
注意:这里的
xx
替换为你自己编写的api
文件的名字
再来看一下使用这个命令的参数说明
Flags:
--api string The api file
--branch string The branch of the remote repo, it does work with --remote
--dir string The target dir
-h, --help help for go
--home string The goctl home path of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
--remote string The remote git repo of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
The git repo directory must be consistent with the https://github.com/zeromicro/go-zero-template directory structure
--style string The file naming format, see [https://github.com/zeromicro/go-zero/blob/master/tools/goctl/config/readme.md] (default "gozero")
参数 | 含义 | 必填 |
---|---|---|
api | api 文件路径 | 是 |
branch | 远程模板所在 git 分支名称,仅当 remote 有值时使用 | 否 |
dir | 代码输出目录 | 否 |
home | 本地模板文件目录 | 否 |
remote | 远程模板所在 git 仓库地址,当此字段传值时,优先级高于 home 字段值 | 否 |
style | 输出文件和目录的命名风格格式化符号 | 否 |
api
常用于指定文件路径
一般是直接在当前的api
目录下,使用命令,所以这里的文件路径通常是文件的名字即可,如-api xx.api
, -api
后面跟着的就是文件路径
style
常用于生成logic
文件的命名
如--style = goZero
就会生成如userLogic
这种驼峰式命名的文件
dir
常用于指定代码输出的目录,一般是直接-dir.
,指定当前目录
生成的文件夹结构如下:
官方声明model
命令支持3种数据库,分别是Mongo
、MySQL
、PostgreSQL
。笔者这里主要是使用MySQL
数据库进行操作。
运行 goctl model mysql --help
,查看mysql
的model
指令怎么使用?
Available Commands:
datasource Generate model from datasource
//从数据库连接生成代码
ddl Generate mysql model from ddl
//从ddl(sql文件)生成代码
Flags:
-h, --help help for mysql
-i, --ignore-columns strings Ignore columns while creating or updating rows (default [create_at,created_at,create_time,update_at,updated_at,update_time])
--strict Generate model in strict mode
说明:goctl model mysql
指令用于生成基于 MySQL 的 model
代码,支持生成带缓存
和不带缓存
的代码。
MySQL 代码生成支持从 sql 文件
,数据库连接
两个来源生成代码。
这里的带缓存只需要在命令末尾添加
--cahe = true
即可实现,非常方便,其底层是基于redis
实现的。
笔者这里演示从ddl
生成代码
goctl model mysql ddl
指令用于从 sql
文件生成 model
代码。
命令如下:
goctl model mysql ddl --src user.sql --dir .
再来看一下使用这个命令的参数说明
Flags:
--branch string The branch of the remote repo, it does work with --remote
-c, --cache Generate code with cache [optional]
--database string
-d, --dir string The target dir
-h, --help help for ddl
--home string The goctl home path of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
--idea For idea plugin [optional]
--remote string The remote git repo of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
The git repo directory must be consistent with the https://github.com/zeromicro/go-zero-template directory structure
-s, --src string The path or path globbing patterns of the ddl
--style string The file naming format, see [https://github.com/zeromicro/go-zero/blob/master/tools/goctl/config/readme.md]
参数 | 含义 | 必填 |
---|---|---|
branch | 远程模板所在 git 分支名称,仅当 remote 有值时使用 | 否 |
cache | 是否生成带缓存的代码,默认为false |
否 |
dir | 代码输出目录 | 否 |
home | 本地模板文件目录 | 否 |
remote | 远程模板所在 git 仓库地址,当此字段传值时,优先级高于 home 字段值 | 否 |
src | sql 文件路径 |
是 |
style | 输出文件和目录的命名风格格式化符号 | 否 |
ignore-columns | 需要忽略的字段,插入或者更新时需要忽略的字段 | 否 |
strict | 是否是严格模式 ,如果是严格模式下,会对 unsigned 修饰的字段转换为对应的数据类型,主要针对数值型 ,例如:如果数据库中列为 bigint 类型,如果为unsigned 修饰则对应的 golang 数据类型就为 int64 ,否则为 uint64 ,如果 strict 为 false ,则不关注unsigned 修饰 |
否 |
strict机制
的引入是针对MySQL
与golang
数据类型映射的转换关系处理
src
常用于指定sql文件路径
一般是直接在当前的model
目录下,使用命令,所以这里的文件路径通常是文件的名字即可,如--src xx.sql
, --src
后面跟着的就是sql
文件的路径
style
常用于生成logic
文件的命名
如--style = goZero
就会生成如userLogic
这种驼峰式命名的文件
dir
常用于指定代码输出的目录,一般是直接-dir.
,指定当前目录
根据 protobufer
文件生成 rpc 服务
。
goctl rpc protoc xx.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=.
goctl rpc protoc xx.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=. -m
注意:
- 上述命令的
xx
替换为你具体写的proto
文件pb
替换为你想把生成的代码存放的文件夹名字
再来看一下使用这个命令的参数说明
Flags:
--branch string The branch of the remote repo, it does work with --remote
-c, --client Whether to generate rpc client (default true)
-h, --help help for protoc
--home string The goctl home path of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
-m, --multiple Generated in multiple rpc service mode
--remote string The remote git repo of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
The git repo directory must be consistent with the https://github.com/zeromicro/go-zero-template directory structure
--style string The file naming format, see [https://github.com/zeromicro/go-zero/blob/master/tools/goctl/config/readme.md]
-v, --verbose Enable log output
--zrpc_out string The zrpc output directory
参数 | 含义 | 必填 |
---|---|---|
branch | 模板仓库分支,配合 --remote 使用 | 否 |
home | 模板仓库本地路径,优先级高于 --remote | 否 |
multiple | 是否生成多个 rpc 服务 | 否 |
remote | 模板仓库远程路径 | 否 |
style | 文件命名风格,详情可参考 文件风格 | 否 |
zrpc_out | 输出目录 | 否 |
multiple
常用于启动多个rpc
服务
style
常用于生成logic
文件的命名
如--style = goZero
就会生成如userLogic
这种驼峰式命名的文件
zrpc_out
常用于指定输出的目录,一般是直接zerp_out = .
指定当前目录
一键生成的文件夹结构如下图:
官方文档
本文主要是针对最常用的
api
、model
、rpc
代码生成进行描述。
实际上,goctl
生成工具功能很强大,更多的代码生成命令可以根据自己的需求在官方文档进行查看
看到这里的小伙伴,恭喜你又掌握了一个技能
希望大家能取得胜利,坚持就是胜利
我是寸铁!我们下期再见
【保姆级教程】Windows11下go-zero的etcd安装与初步使用
【保姆级教程】Windows11安装go-zero代码生成工具goctl、protoc、go-zero
【Go-Zero】手把手带你在goland中创建api文件并设置高亮
【Go-Zero】Error: user.api 27:9 syntax error: expected ‘:‘ | ‘IDENT‘ | ‘INT‘, got ‘(‘ 报错解决方案及api路由注意事项
【Go-Zero】Error: only one service expected goctl一键转换生成rpc服务错误解决方案
【Go-Zero】【error】 failed to initialize database, got error Error 1045 (28000):报错解决方案
【Go-Zero】Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)报错解决方案
【Go-Zero】type mismatch for field “Auth.AccessSecret“, expect “string“, actual “number“报错解决方案
【Go-Zero】Error: user.api 30:2 syntax error: expected ‘)‘ | ‘KEY‘, got ‘IDENT‘报错解决方案
【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案
【Go面试向】defer与time.sleep初探
【Go面试向】defer与return的执行顺序初探
【Go面试向】Go程序的执行顺序
【Go面试向】rune和byte类型的认识与使用
【Go面试向】实现map稳定的有序遍历的方式