又有新功能!Go 将有生成新模板的 gonew 工具链

大家好,我是煎鱼。

不知道大家平时在日常工作中,会不会遇到一个问题?公司用着微服务架构,经常要创建新的服务,需要一个应用模板去初始化新的服务,减少 ctrl+c+v,转为相对自动化。

不同团队根据 Leader 的喜好、要求不同,应用模板又会不同。有的喜欢 DDD、有的喜欢 MVC、有的大道至简即可。每家公司都会延伸出一个工具链做这个事情。

新工具:gonew 生成模板

在 Go 社区也出现了这种诉求,Go 核心团队带头大哥 @Russ Cox 发起了一个新讨论《gonew: templates for new modules》,引发了各方的热议:

原因是:Go 团队经常收到用户反馈要求使用某种 "go new" 功能,以某种基本模板启动一个新的模块(项目)。

这个工具不局限于 Go 团队提供的模板,任何人都可以定义这个模板。这个模板也是很 "普通",没什么特殊的功能。

"go new" 的核心工作是下载一个模板,更改其模块路径,然后把它放到一个新的目录中进行编辑。当然这个工具链未来可能还有更多的功能,但这就是最核心的诉求。

也出现了一个新的场景。有一名图书作者,希望能够更方便的提供图书示例,不想要图书读者费尽心思克隆一个 git 仓库。答案显而易见,那就是本文提到的 gonew 工具。

快速体验和实操

结合前后事迹来看,@Russ Cox 是一个执行效率比较高的人。提出讨论的前几个月,已经写好了工具给大家试用了。

安装命令如下:

bash 复制代码
$ go install golang.org/x/tools/cmd/gonew@latest
go: downloading golang.org/x/tools v0.11.1
go: downloading golang.org/x/mod v0.12.0

创建命令如下:

bash 复制代码
$ gonew golang.org/x/example/hello
gonew: initialized golang.org/x/example/hello in ./hello

执行完毕后,会在当前目录下,创建一个 hello 目录(./hello)。模板的结构如下:

go 复制代码
$ tree hello 
hello
├── LICENSE
├── go.mod
├── hello.go
└── reverse
    ├── example_test.go
    ├── reverse.go
    └── reverse_test.go

1 directory, 6 files

我对比了一下,和模板基准的 git 仓库 github.com/golang/example 的相关代码是一致的。

可能会有同学说,不行啊。我还要改 module path。这点在现在也是已经支持的了。

如下命令:

bash 复制代码
$ gonew github.com/ServiceWeaver/template example.com/foo
gonew: initialized example.com/foo in ./foo

生成目录:

go 复制代码
$ tree foo
foo
├── LICENSE
├── README.md
├── go.mod
├── go.sum
├── main.go
├── weaver.toml
└── weaver_gen.go

对应生成的目录名是指定的 foo,创建出来的 go.mod 文件的 module path 是:module example.com/foo

符合上面提的要求。

一些讨论

结合讨论的内容来看,大家的反馈都是比较积极支持的。因为确实看到社区里很多人为此做了一模一样的事情,各语言都有,真的是各显神通了。

有个别同学支持将本文提到的 go new 放到 go mod init 中,这样就不需要再单独创造一个新的命令集。

提出的同学认为 go mod init 本质上也是在引导 Go 应用的使用,和 go new 比较类似。可以调整为:

arduino 复制代码
go mod init example.com/x/abc --template github.com/ServiceWeaver/template

以此满足一样的诉求。

不过我感觉这命令就太长了,没 go new 那么短小精悍。

总结

本次 go new 工具的讨论和实验,Go 团队非常迅速。目测势在必得,肯定会加进去了。

因为根据反馈 Google 的几个团队也有兴趣尝试使用 gonew 进行模板化。ServiceWeaver 团队对此也非常感兴趣。

功能虽然非常简单,但基本满足了不同的团队为了不同的代码模板,创建一个新的模板的诉求。一旦成熟,也就不需要人均手搓一个模板的脚手架工具了。

后续各自在工具链套一下就 OK,一个快速的小成果就好了。推荐大家试用,又或是觉得还需要什么功能补充,也欢迎随时留言。

文章持续更新,可以微信搜【脑子进煎鱼了】阅读,本文 GitHub github.com/eddycjy/blo... 已收录,学习 Go 语言可以看 Go 学习地图和路线,欢迎 Star 催更。

Go 图书系列

推荐阅读

相关推荐
研究司马懿6 小时前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
梦想很大很大20 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰1 天前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘1 天前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤1 天前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt112 天前
AI DDD重构实践
go
Grassto3 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto5 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室6 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题6 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo