package main import ( "fmt" "os" "os/exec" "path/filepath" "strings" "time" ) // 处理单个 pb.go 文件,去掉 ,omitempty func handleFile(path string) error { fmt.Println("正在处理文件:", path) content, err := os.ReadFile(path) if err != nil { return err } // 去掉 ,omitempty 标签 newContent := strings.ReplaceAll(string(content), ",omitempty", "") return os.WriteFile(path, []byte(newContent), 0644) } // 查找 biz/model 目录及其子目录下最新的 .pb.go 文件,忽略 biz/model/api func findLatestPBGoFile(root string) (string, error) { var latestFile string var latestTime time.Time ignoreDir := filepath.Join(root, "api") err := filepath.WalkDir(root, func(path string, d os.DirEntry, err error) error { if err != nil { return err } // 忽略 biz/model/api 目录 if d.IsDir() && strings.HasPrefix(path, ignoreDir) { return filepath.SkipDir } if !d.IsDir() && strings.HasSuffix(d.Name(), ".pb.go") { info, err := d.Info() if err != nil { return err } modTime := info.ModTime() if modTime.After(latestTime) { latestTime = modTime latestFile = path } } return nil }) if err != nil { return "", err } if latestFile == "" { return "", fmt.Errorf("未找到 .pb.go 文件") } return latestFile, nil } func main() { if len(os.Args) < 2 { fmt.Println("用法: genpb.exe ") os.Exit(1) } protoFile := os.Args[1] // 1. 执行 hz update(同步等待执行完毕) cmd := exec.Command("hz", "update", "-I", "idl", "-idl", protoFile) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr fmt.Println("正在执行 hz update ...") if err := cmd.Run(); err != nil { fmt.Println("hz update 执行失败:", err) os.Exit(1) } fmt.Println("hz update 执行完成.") // 2. 查找最新 pb.go 文件并处理 modelDir := "biz/model" latestFile, err := findLatestPBGoFile(modelDir) if err != nil { fmt.Println("查找最新 .pb.go 文件失败:", err) os.Exit(1) } if err := handleFile(latestFile); err != nil { fmt.Println("处理 pb.go 文件失败:", err) os.Exit(1) } fmt.Println("最新 .pb.go 文件处理完成:", latestFile) }