Skip to content

cztctl ​

English

go-zero 官方 goctl 的增强版代码生成工具,作为独立模块发布。在保持与 goctl 兼容的基础上,扩展了 Swagger 文档生成、RabbitMQ 消费者服务生成、分布式定时任务服务生成等能力。

cztctl 语法高亮插件 cztctl-intellij

插件进入 goland 插件市场搜索 cztctl,安装即可使用

安装 ​

bash
go install github.com/lerity-yao/czt-contrib/cztctl@latest

验证安装:

bash
cztctl --version
# cztctl version 1.10.11 linux/amd64 (go-zero v1.10.3)

命令一览 ​

cztctl api swagger    从 .api 文件生成 Swagger 文档
cztctl api cron       从 .cron 文件生成分布式定时任务服务
cztctl api rabbitmq   从 .rabbitmq 文件生成 RabbitMQ 消费者服务
cztctl env            查看或编辑 cztctl 环境变量
cztctl rpc sdk        生成 RPC 客户端 SDK 并发布到独立 Git 仓库

api swagger ​

从 go-zero 标准 .api 文件生成 Swagger 2.0 文档,增强支持 validate tag 自动注释和字段头部多行注释解析。

bash
cztctl api swagger -api user.api -dir . -filename user-api.json
参数说明
-api.api 文件路径
-dir输出目录
-filename输出文件名
--yaml输出 YAML 格式

info 块支持的属性 ​

在 .api 文件的 info() 块中,以下属性会直接映射到 Swagger 文档(与 go-zero 一致):

属性说明示例
title文档标题title: "用户服务"
description文档描述description: "用户相关接口"
versionAPI 版本号version: "1.0"
termsOfService服务条款 URLtermsOfService: "https://..."
contactName联系人姓名contactName: "张三"
contactURL联系人 URLcontactURL: "https://..."
contactEmail联系人邮箱contactEmail: "a@b.com"
licenseName许可证名称licenseName: "MIT"
licenseURL许可证 URLlicenseURL: "https://..."
hostAPI 主机地址host: "api.example.com"
basePathAPI 基础路径basePath: "/v1"
schemes协议(逗号分隔)schemes: "https,http"
produces响应 Content-Typeproduces: "application/json"
consumes请求 Content-Typeconsumes: "application/json"
useDefinitions是否使用 $ref 引用useDefinitions: "true"
wrapCodeMsg是否包装 code/msg 响应wrapCodeMsg: "true"
bizCodeEnumDescription业务码枚举描述字段名bizCodeEnumDescription: "business code"
externalDocsDescription外部文档描述externalDocsDescription: "详细文档"
externalDocsURL外部文档 URLexternalDocsURL: "https://..."

@server 支持的注解 ​

在 .api 文件的 @server() 块中,以下属性会影响 Swagger 生成:

属性说明
tags分组标签,对应 Swagger tags
summary接口摘要
prefix路由前缀,拼接到路径前
group代码分组目录
deprecated标记接口已废弃
operationId自定义 operationId
authType认证类型

api cron ​

从 .cron 文件生成基于 czt-contrib/cron 分布式定时任务框架的定时任务服务。支持内部定时任务(@cron)和外部触发任务两种模式。

bash
cztctl api cron -api task.cron -dir ./output
参数说明
-api.cron 文件路径
-dir输出目录
--style文件命名风格,默认 gozero
--remote远程模板 Git 仓库地址
--branch远程模板分支
--home本地模板目录

生成的目录结构 ​

output/
├── etc/
│   └── usercron.yaml         配置文件
├── internal/
│   ├── config/
│   │   └── config.go         配置结构体
│   ├── handler/              handler 层(任务注册)
│   │   └── user/             按 group 分目录
│   ├── logic/                logic 层(业务代码写这里)
│   │   └── user/
│   ├── svc/
│   │   └── servicecontext.go 服务上下文
│   ├── types/
│   │   └── types.go          请求/响应类型
│   └── worker/
│       └── worker.go         任务注册(cron 调度 + asynq handler 绑定)
└── usercron.go               主入口

rabbitmq 生成结构与 cron 基本一致,区别在于 worker 层处理的是 MQ 消费而非 cron 调度。

.cron 文件语法 ​

.cron 文件采用类 go-zero api 的 DSL 语法,由以下顶层声明组成:

syntax(必填) ​

声明语法版本,当前固定为 "v1"。

syntax = "v1"

info(可选) ​

描述服务的元信息,支持任意 key-value 对:

info (
    title: "用户定时任务服务"
    desc: "处理用户相关的定时与异步任务"
    version: "1.0"
    author: "张三"
    email: "zhangsan@example.com"
)

import(可选) ​

导入其他 .cron 文件中的类型定义,支持单行和分组两种写法:

import "common.cron"

import (
    "user.cron"
    "order.cron"
)

type(可选) ​

定义请求参数结构体,语法与 go-zero api 的 type 完全一致,支持基本类型、切片、map、指针、嵌套结构体、struct tag:

type CleanReq {
    UserId int64  `json:"userId"`
    Action string `json:"action"`
}

type (
    ArchiveReq {
        StartDate string `json:"startDate"`
        EndDate   string `json:"endDate"`
    }

    NotifyReq {
        Email   string   `json:"email"`
        Content string   `json:"content"`
        Tags    []string `json:"tags"`
    }
)

@server(可选) ​

为 service 块设置元数据,支持以下字段:

字段说明示例
tagsSwagger 分组标签tags: "用户管理"
summary服务摘要summary: "用户定时任务"
description服务描述description: "详细说明"
group代码分组目录group: user
middleware中间件(逗号分隔多个)middleware: Auth,Log
@server (
    tags: "用户管理"
    summary: "用户相关定时任务"
    group: user
    middleware: LogMiddleware
)

service(必填) ​

定义服务和任务列表。每个任务项由以下注解组成:

注解必填说明
@doc否任务文档,支持字符串和 KV 两种写法
@cron否cron 表达式,有则为内部定时任务,无则为外部触发任务
@cronRetry否失败重试次数,整数
@handler是任务名称,即 asynq task type
路由行是任务标识,可选带请求参数 TaskName(ReqType)

路由名规则:

路由名由标识符(字母、数字、下划线、$)组成,支持 -(横杠)和 :(冒号)作为分隔符:

CleanUserTask           // 纯标识符
sync-order              // 横杠分隔
email:send              // 冒号分隔
data-sync:daily         // 混合分隔

@doc 两种写法:

// 字符串写法
@doc "简单的文档注释"

// KV 写法
@doc(
    summary: "数据归档任务"
    description: "每天凌晨归档历史数据"
)

完整示例:

syntax = "v1"

info (
    title: "用户定时任务服务"
    version: "1.0"
)

type (
    CleanReq {
        UserId int64 `json:"userId"`
    }
)

@server (
    tags: "用户管理"
    group: user
)
service userCron {
    // 内部定时任务:每分钟执行,失败重试 3 次
    @doc "清理过期用户数据"
    @cron "*/1 * * * *"
    @cronRetry 3
    @handler CleanUserJob
    CleanUserTask(CleanReq)

    // 内部定时任务:无参数
    @doc(
        summary: "数据归档"
        description: "每天凌晨 2 点归档"
    )
    @cron "0 2 * * *"
    @handler ArchiveDataJob
    ArchiveDataTask

    // 外部触发任务:无 @cron,由业务代码调用 Add 触发
    @doc "发送邮件通知"
    @handler SendEmailJob
    SendEmailTask(CleanReq)
}

任务类型区分:

  • 有 @cron → 内部定时任务,框架按 cron 表达式自动调度
  • 无 @cron → 外部触发任务,通过 asynq.Client.Enqueue 手动触发(支持延时执行、立即执行)

api rabbitmq ​

从 .rabbitmq 文件生成基于 czt-contrib/mq/rabbitmq 分布式 RabbitMQ 消费者服务框架的 RabbitMQ 消费者服务。

bash
cztctl api rabbitmq -api order.rabbitmq -dir ./output
参数说明
-api.rabbitmq 文件路径
-dir输出目录
--style文件命名风格,默认 gozero
--remote远程模板 Git 仓库地址
--branch远程模板分支
--home本地模板目录

.rabbitmq 文件语法 ​

.rabbitmq 文件与 .cron 文件共享相同的基础语法(syntax / info / import / type / @server),区别在于 service 块内的任务定义。

service(必填) ​

每个任务项由以下注解组成:

注解必填说明
@doc否消费者文档,支持字符串和 KV 两种写法
@handler是消费者处理器名称
路由行是队列名称(点分隔标识符),可选带消息参数

队列名称规则:

路由名由标识符(字母、数字、下划线、$)组成,支持 .(点号)和 -(横杠)作为分隔符,对应 RabbitMQ 的队列名称:

order.created           // 点号分隔
payment.refund.success  // 多段点号
payment-refund          // 横杠分隔
order.pay-callback      // 混合分隔

完整示例:

syntax = "v1"

info (
    title: "订单消息队列消费者"
    desc: "处理订单相关的 MQ 事件"
    version: "1.0"
)

type (
    OrderCreatedEvent {
        OrderId int64   `json:"orderId"`
        Amount  float64 `json:"amount"`
    }
)

@server (
    tags: "订单管理"
    summary: "订单事件消费者"
    group: order
    middleware: LogMiddleware
)
service order-mq {
    // 无消息参数的消费者
    @doc "订单创建事件"
    @handler OrderCreatedConsumer
    order.created

    // 带消息参数的消费者
    @doc(
        summary: "支付成功事件"
        description: "处理支付成功后的后续逻辑"
    )
    @handler PaymentSuccessConsumer
    payment.success(OrderCreatedEvent)

    // 简单字符串文档
    @doc "用户注册事件"
    @handler UserRegisteredConsumer
    user.registered
}

.cron 与 .rabbitmq 语法对比 ​

特性.cron.rabbitmq
syntax / info / import / type完全相同完全相同
@server完全相同完全相同
@doc完全相同完全相同
@cron支持不支持
@cronRetry支持不支持
@handlertask type 名称消费者名称
路由行格式TaskName[(ReqType)]queue.name[(MsgType)]
路由名分隔符-(横杠)、:(冒号).(点号)、-(横杠)
路由行命名标识符,支持横杠/冒号分隔标识符,支持点号/横杠分隔

远程模板 ​

cron 和 rabbitmq 命令支持通过 --remote 和 --branch 拉取远程 Git 仓库中的自定义模板,覆盖内置模板:

bash
cztctl api cron \
  -api task.cron \
  -dir ./output \
  --remote https://your-git-repo/goctl-template.git \
  --branch dev

模板文件会被 clone 到 ~/.cztctl/.git/ 目录下,后续模板加载优先使用远程模板。

文件命名风格 ​

通过 --style 控制生成文件的命名风格:

风格示例
gozero(默认)servicecontext.go
go_zeroservice_context.go
goZeroserviceContext.go

rpc sdk ​

将 RPC 服务的客户端代码自动生成为独立的 Go 模块,一键推送到指定 Git 仓库。调用方通过 go get 引入即可调用,无需关心 proto 定义和代码生成。

bash
cztctl rpc sdk --proto proto/order.proto --repo https://gitlab.ddtz.com/rpc-sdk/order-sdk.git
参数短名必填默认值说明
--proto-是-proto 文件路径(相对或绝对路径均可)
--repo-是-SDK 仓库完整 git URL(http:// 或 https://)
--repo-user-否cztctl-bot仓库认证用户名
--repo-token-否内置默认值仓库认证凭据(GitLab Access Token)
--remote-否空goctl 远程模板 git URL
--style-否gozero命名风格
--tag-否自动递增版本号(SemVer 格式,如 v1.0.0)
--branch-否空goctl 远程模板分支
-m--multiple否false多服务模式, rpc 服务如果是多模式,需要传入此值
--repo-branch-否mainSDK 仓库 Git 分支名
--goproxy-否系统默认Go module 代理地址,工具会执行 go mod tidy,如果网络有问题,可以传入代理

工作流程 ​

  1. 克隆已有 SDK 仓库(新仓库则初始化)
  2. 清理旧客户端代码
  3. 初始化 go.mod(若不存在)
  4. 递归复制 proto 文件(包含依赖 proto)
  5. 自动生成 .kong.proto(Kong gRPC-gateway HTTP 注解变体)
  6. 调用 goctl 生成客户端代码
  7. 清理服务端代码(仅保留 client/ 目录)
  8. go mod tidy 整理依赖
  9. Git 提交、打标签、推送到远程仓库

Kong gRPC-gateway Proto 自动生成 ​

执行 cztctl rpc sdk 时,会自动在 _sdk/ 目录中生成与 proto 同名的 .kong.proto 文件,用于 Kong 网关的 gRPC-gateway 路由配置。

生成规则:

  • 自动添加 import "google/api/annotations.proto"
  • 为每个 rpc 方法生成 option (google.api.http) 注解
  • HTTP 路径:/{ServiceName}/{RpcMethodName}
  • HTTP 方法统一为 POST,附带 body: "*"

示例:

原始 vehicle.proto:

proto
service SfVehicle {
  rpc SfTaskCreate(SfTaskCreateReq) returns (SfTaskCreateRes);
}

生成的 vehicle.kong.proto:

proto
import "google/api/annotations.proto";

service SfVehicle {
  rpc SfTaskCreate(SfTaskCreateReq) returns (SfTaskCreateRes) {
    option (google.api.http) = { post: "/SfVehicle/SfTaskCreate" body: "*" };
  }
}

版本号规则 ​

  • 首次发布默认:v1.0.0
  • 后续自动递增 patch:v1.0.0 → v1.0.1 → v1.0.2 → ...
  • patch 到 99 后自动进位 minor:v1.0.99 → v1.1.0
  • 可通过 --tag 手动指定(必须大于当前最新版本)

使用示例 ​

最简用法:

bash
cztctl rpc sdk \
  --proto proto/tax_invoice.proto \
  --repo https://gitlab.ddtz.com/rpc-sdk/tax-invoice-sdk.git

完整示例:

bash
cztctl rpc sdk \
  --proto proto/order.proto \
  --repo https://gitlab.ddtz.com/rpc-sdk/order-sdk.git \
  --style gozero \
  --branch develop \
  -m \
  --repo-branch main \
  --goproxy https://goproxy.cn,direct

SDK 调用方使用 ​

bash
# 拉取 SDK
go get gitlab.ddtz.com/rpc-sdk/order-sdk@latest

# 或指定版本
go get gitlab.ddtz.com/rpc-sdk/order-sdk@v1.0.2
go
import "gitlab.ddtz.com/rpc-sdk/order-sdk/client/order"

client := order.NewOrder(zrpc.MustNewClient(conf.OrderRpc))
resp, err := client.GetOrder(ctx, &order.GetOrderRequest{Id: 123})

env ​

查看或编辑 cztctl 环境变量。环境配置持久化在 ~/.cztctl/env 文件中。

查看环境变量 ​

bash
cztctl env

输出示例:

CZTCTL_OS=linux
CZTCTL_ARCH=amd64
CZTCTL_HOME=/home/user/.cztctl
CZTCTL_CACHE=/home/user/.cztctl/cache
CZTCTL_EXPERIMENTAL=off
CZTCTL_VERSION=1.10.11

编辑环境变量 ​

bash
cztctl env -w KEY=VALUE

支持同时设置多个值:

bash
cztctl env -w CZTCTL_EXPERIMENTAL=on -w CZTCTL_HOME=/custom/path

支持的变量 ​

变量说明默认值
CZTCTL_OS操作系统(只读)runtime.GOOS
CZTCTL_ARCH系统架构(只读)runtime.GOARCH
CZTCTL_HOMEcztctl 主目录~/.cztctl
CZTCTL_CACHE缓存目录~/.cztctl/cache
CZTCTL_VERSION当前版本(只读)构建版本号
CZTCTL_EXPERIMENTAL实验性功能开关off

CZTCTL_EXPERIMENTAL ​

控制 DSL 解析器选择:

  • off(默认):使用 ANTLR4 解析器
  • on:使用手写递归下降解析器
bash
# 切换到手写解析器
cztctl env -w CZTCTL_EXPERIMENTAL=on

# 切换回 ANTLR4 解析器
cztctl env -w CZTCTL_EXPERIMENTAL=off

版本规则 ​

版本号格式:v<go-zero主版本>.<微版本>

  • 前两段(如 1.10)对应所依赖的 go-zero 版本
  • 末段为 cztctl 自身递增版本号
  • --version 输出自动关联 go.mod 中的 go-zero 版本

License ​

同 go-zero,MIT License。