package main import ( "encoding/json" "errors" "fmt" "io" "io/fs" "log" "os" "path" "runtime" ) type VersionInfo struct { Version string `json:"version"` BuildId int `json:"build_id"` TotalBuild int `json:"total_build"` } func main() { _, file, _, ok := runtime.Caller(0) if !ok { log.Print("Unable to get the current file") return } basePath := path.Join(path.Dir(file), "../../") versionFile, err := os.Open(path.Join(basePath, "app/dist/version.json")) if err != nil { if errors.Is(err, fs.ErrNotExist) { log.Print("\"dist/version.json\" not found, load from src instead") versionFile, err = os.Open(path.Join(basePath, "app/src/version.json")) } if err != nil { log.Fatal(err) return } } defer func(versionFile fs.File) { err := versionFile.Close() if err != nil { log.Fatal(err) } }(versionFile) // Read the version.json file data, err := io.ReadAll(versionFile) if err != nil { log.Fatalf("Failed to read version.json: %v", err) } // Parse the JSON data var versionInfo VersionInfo err = json.Unmarshal(data, &versionInfo) if err != nil { log.Fatalf("Failed to parse JSON: %v", err) } // Generate the version.gen.go file content genContent := fmt.Sprintf(`// Code generated by cmd/version/generate.go; DO NOT EDIT. package version func init() { Version = "%s" BuildId = %d TotalBuild = %d } `, versionInfo.Version, versionInfo.BuildId, versionInfo.TotalBuild) genPath := path.Join(basePath, "internal/version/version.gen.go") err = os.WriteFile(genPath, []byte(genContent), 0644) if err != nil { log.Fatalf("Failed to write version.gen.go: %v", err) } fmt.Println("version.gen.go has been generated successfully.") }