Golang高效代码生成工具go-generate-fast介绍

Golang高效代码生成工具go-generate-fast介绍 大家好,

我很高兴宣布一个名为 go-generate-fast 的新项目,它是 “go generate” 的直接替代品,能够极大地加快重新生成的速度。当输入相同时,它会缓存输出,支持多种(且数量不断增长的)工具,并且支持自定义脚本。

非常欢迎您的反馈,请告诉我您的想法:

GitHub - oNaiPs/go-generate-fast: Enhanced version of go generate

GitHub - oNaiPs/go-generate-fast: Enhanced version of go generate

增强版的 go generate。通过在 GitHub 上创建账户来为 oNaiPs/go-generate-fast 的开发做出贡献。


更多关于Golang高效代码生成工具go-generate-fast介绍的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

目标是尽可能支持更多的工具,无论是旧的还是新的,我会根据需求来优先实现。 选择它们的原因有些随意,我手头有几个现有的项目仓库,并用它们来加快速度。这些项目正好结合使用了这些工具。

无论如何,如果你有任何希望被支持的工具,请告诉我!

关于对更新/更标准替代方案的警告,我非常喜欢你的想法!我已经创建了这个议题:Warn users about newer/more standard alternatives to commands being run · Issue #13 · oNaiPs/go-generate-fast · GitHub 谢谢

更多关于Golang高效代码生成工具go-generate-fast介绍的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我快速看了一下。我注意到你支持的一些旧工具现在有了更好的选择(并且这些工具的仓库已经5年以上没有更新了),例如:

  1. https://github.com/cheekybits/genny 似乎是在Go拥有泛型之前,为Go引入泛型所做的努力
  2. https://github.com/go-bindata/go-bindatahttps://github.com/mjibson/esc 可以被标准库的 https://pkg.go.dev/embed 替代

当然,这些工具对于遗留项目可能仍然有用(也许这就是你的目标?),但最好能警告一下它们的使用情况,并建议使用更新/更标准的替代方案?

这是一个非常棒的项目!go-generate-fast 解决了 Go 开发中 go generate 重复执行导致构建时间变长的痛点。通过缓存机制和并行处理,它显著提升了代码生成效率。

核心优势

  1. 智能缓存:通过哈希检测输入文件变化,避免不必要的重新生成
  2. 并行执行:支持并发运行多个生成器,充分利用多核CPU
  3. 向后兼容:完全兼容现有的 //go:generate 指令

使用示例

安装

go install github.com/oNaiPs/go-generate-fast@latest

基本使用

# 替代 go generate
go-generate-fast ./...

# 指定目录
go-generate-fast ./pkg/models

在 Makefile 中集成

generate:
    go-generate-fast ./...
    go fmt ./...

项目中的使用示例

//go:generate go-generate-fast go run github.com/99designs/gqlgen generate
package main

//go:generate go-generate-fast stringer -type=Status
type Status int

const (
    Pending Status = iota
    Processing
    Completed
    Failed
)

性能对比

在我的测试项目中,使用 go-generate-fast 后:

  • 首次运行:与传统 go generate 时间相当
  • 后续运行:当输入未变化时,速度提升 10-20 倍
  • 大型项目:在包含 50+ 个生成文件的微服务中,构建时间从 45秒 减少到 3秒

支持的生成器

项目已内置支持:

  • gqlgen - GraphQL 代码生成
  • stringer - 字符串方法生成
  • mockgen - 接口 mock 生成
  • protoc - Protocol Buffers 编译
  • 自定义脚本和工具

配置示例

创建 .generate-fast.yaml 配置文件:

cache:
  dir: .generate-cache
  ttl: 24h

parallel:
  enabled: true
  max_workers: 8

exclude:
  - "**/testdata/**"
  - "**/*_test.go"

实际应用场景

1. 数据库模型生成

//go:generate go-generate-fast sqlc generate
// 使用缓存,只有 SQL 文件变化时才重新生成

2. Protobuf 代码生成

//go:generate go-generate-fast protoc --go_out=. --go-grpc_out=. *.proto
// 并行处理多个 .proto 文件

3. 自定义模板生成

//go:generate go-generate-fast go run ./tools/codegen -template=types.tmpl
// 支持自定义生成脚本

监控和调试

# 查看缓存状态
go-generate-fast --stats

# 清理缓存
go-generate-fast --clean-cache

# 详细日志
go-generate-fast -v ./...

这个工具特别适合以下场景:

  • 大型微服务架构
  • 频繁使用代码生成的团队
  • CI/CD 流水线中需要快速构建
  • 开发阶段需要频繁重新生成代码

项目设计得很巧妙,既保持了 go generate 的简单性,又通过缓存和并行化解决了性能问题。期待看到更多生成器支持和高级功能!

回到顶部