//go:build entgenerate package main import ( "fmt" "log" "strings" "entgo.io/ent/entc" "entgo.io/ent/entc/gen" ) // camel 把 snake_case 的字段名/边名转成 camelCase。 // 项目约定:接口 JSON 一律 camelCase(见《技术约束.md》), // 而 ent 默认生成的 json tag 是 snake_case,这里统一覆盖。 func camel(s string) string { parts := strings.Split(s, "_") for i := 1; i < len(parts); i++ { if parts[i] != "" { parts[i] = strings.ToUpper(parts[i][:1]) + parts[i][1:] } } return strings.Join(parts, "") } // camelJSON 扩展:为所有字段与边设置 camelCase 的 json tag。 type camelJSON struct { entc.DefaultExtension } func (camelJSON) Hooks() []gen.Hook { return []gen.Hook{ func(next gen.Generator) gen.Generator { return gen.GenerateFunc(func(g *gen.Graph) error { for _, n := range g.Nodes { for _, f := range n.Fields { // schema 中显式声明的标签(如 json:"-")不覆盖 if f.StructTag != "" && strings.Contains(f.StructTag, `json:"-"`) { continue } f.StructTag = fmt.Sprintf("json:%q", camel(f.Name)+",omitempty") } for _, e := range n.Edges { if e.StructTag != "" && strings.Contains(e.StructTag, `json:"-"`) { continue } e.StructTag = fmt.Sprintf("json:%q", camel(e.Name)+",omitempty") } } return next.Generate(g) }) }, } } func main() { err := entc.Generate("./schema", &gen.Config{ Package: "bj_power_wms/ent", Target: "./ent", Features: []gen.Feature{ gen.FeatureVersionedMigration, gen.FeatureUpsert, }, }, entc.Extensions(camelJSON{})) if err != nil { log.Fatalf("running ent codegen: %v", err) } }