简介

之前写过一篇关于 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…