一个 Ent 插件,用于从 Ent Schema 生成 Domain Entity 与 DTO 定义 Protobuf Message。
主要为 Clean Architecture (Kratos) 设计模式提供支持。
Code mainly by Gemini AI.
- 自动更新字段定义,修改字段时只需修改 Ent Schema
- 自动生成 mapper 函数,开箱即用
- 生成行为可高度自定义化
先安装 protoc 与 protoc-gen-go,并保证 protoc-gen-go 在 PATH 中。
# Windows
choco install -y google-protobuf
choco install -y protoc-gen-go
# MacOS / Linux
brew install protobuf
brew install protoc-gen-go
# 检查是否安装成功
protoc --version
protoc-gen-go --version然后安装 lazyent。
go get github.com/Cromemadnd/lazyent@latest然后,如果你的 generate.go 还是 ent 默认提供的,你需要更改它以使用 entc.go。
/* generate.go */
package ent
//go:generate go run entc.go然后在你的 entc.go 中集成 lazyent。
/* entc.go */
//go:build ignore
package main
import (
"log"
"entgo.io/ent/entc"
"entgo.io/ent/entc/gen"
"github.com/Cromemadnd/lazyent"
)
func main() {
// 配置生成选项
opts := []entc.Option{
entc.Extensions(lazyent.NewExtension(
lazyent.Config{
ProtoOut: "api/user/v1", // 配置生成的 proto 文件输出目录(以项目的 go.mod 所在目录为基准,下同)
ServiceOut: "internal/user/service", // 配置生成的 service 文件输出目录
BizOut: "internal/user/biz", // 配置生成的 biz 文件输出目录
DataOut: "internal/user/data", // 配置生成的 data 文件输出目录
ProtoPackage: "user.v1", // 配置生成的 proto 文件的 package
GoPackage: "your-app-package/user/v1;v1", // 配置生成的 Proto 文件的 go package
SingleFile: true, // 是否将所有 schema 的代码合并到一个文件中
},
)),
}
// 执行 Ent 代码生成
// 假设 schema 文件位于 ./schema 目录
if err := entc.Generate("./schema", &gen.Config{
Header: "// Code generated by ent, DO NOT EDIT.",
Package: "your-app-package/app/user/internal/data/ent", // 填写 ent 目录相对 go.mod 所在目录的路径
}, opts...); err != nil {
log.Fatalf("running ent codegen: %v", err)
}
}使用时只需 go generate 即可。
注意:由于Lazyent 不会自动编译生成的 proto 文件,生成的
service_mappers_gen.go默认情况下会报错,你需要手动编译。