支持自定义模板替换的 gonew

简介⌗
之前写过一篇关于 gonew 的文章:《快速基于模板创建 Go 项目》,虽然能一定程度上降低框架基础设施的复制成本,但是还不够完善。
在 Go 的 Repo 里 Russ Cox 发起了关于 gonew: templates for new modules 的讨论,社区有很多想法,但是官方似乎并没有什么动力去维护和更新 gonew 这样一个边缘化的 CLI。
结合自己对 gonew 的需求和社区中的一些功能建议,我决定基于 golang.org/x/tools/cmd/gonew@latest
创建一个更好用的 CLI 脚手架。
功能介绍⌗
除了官方 gonew 的基本用法,我们还支持了自定义项目模板的交互式输入,用来实现代码模板片段的替换。
这样可以在项目被初始化后,读取项目中的 template.yaml
配置,来初始化 CLI 交互,引导用户输入项目所需要的信息,最后根据用户输入替换掉代码中的模板占位符。
安装⌗
go install github.com/betterde/gonew@latest
使用⌗
gonew init <SOURCE_MODULE> [DEST_MODULE]
下面是我使用我自己的项目模板来初始化项目的示例:
gonew init github.com/betterde/template/fiber github.com/betterde/testing
Please enter project name: testing
Please enter project description: Testing gonew init project with template
2025/05/07 09:34:43 initialized github.com/betterde/testing in ./testing
可以看到当 module 别下载后,CLI 会引导用户输入项目所需信息。
构建项目模板⌗
例如在我的 github.com/betterde/template/fiber
项目模板中,我定义了 internal/build/info.go
:
package build
var (
Name = "{{ .name }}"
Desc = "{{ .desc }}"
Build = "current"
Commit = "none"
Version = "develop"
)
这里定义了这个项目的必要配置和模板替换占位符,接下来还要在 module 的更目录创建一个 template.yaml
,这个配置用来定义用户交互的变量名和对应的提示,例如我的项目模板中是这样定义的:
name: "Please enter project name"
desc: "Please enter project description"
所以在上面的初始化项目是你坑看到 2~3 行的引导式用户输入的交互。
总结⌗
实现了这些基本上能满足团队开发的 90% 的需求,如果后面还需要一些高度自定义的设置,还需要对 template.yaml
进行扩展,以及 CLI 功能进行适配。
I hope this is helpful, Happy hacking…