前几周。在关注的go提案每周会议中,发现了一条比较感兴趣的内容: gonew: templates for new modules ,通过标题可以猜到 gonew 应该是一个通过配置项目模板生成新项目的模块。

通过对 discussions 中 rsc 所描述的内容进行分析,可以得知为什么要启动这么一个新项目: go团队经常收到用户的请求,想要通过模板启动一个新项目,即以某种基本的项目模板来创建一个新Go module。Russ私下编写了一个实现这个功能的小工具:rsc.io/tmp/gonew. Russ在google内部宣传该工具后,Google内部的一些团队便定制了一些模板(template) ,尤其是ServiceWeaver团队的响应尤为积极。这一切最终让Russ决定引入golang.org/x/tools/cmd/gonew。 gonew工具的引入大幅简化了Go项目的创建,同时由于对自定义项目模板的支持,也可以提高Go项目的标准化水平。目前 gonew 工具是实验性的,后续可能会增加新的特性,但目前的核心功能是会保留的。

通过对 discussions 中社区用户开发着的回应可以看出,大家纷纷讲述了没有 gonew 前所使用的工具,并对 gonew 建言献策,可以看出大部分的开发者都十分欢迎这个新功能的。

接下来就由我来介绍 gonew 。

安装

通过以下命令安装 gonew:

1
go install golang.org/x/tools/cmd/gonew@latest
1
2
3
$ go install golang.org/x/tools/cmd/gonew@latest
go: downloading golang.org/x/tools v0.12.0
go: downloading golang.org/x/mod v0.12.0

执行 gonew:

1
2
3
$ gonew
usage: gonew srcmod[@version] [dstmod [dir]]
See https://pkg.go.dev/golang.org/x/tools/cmd/gonew.

接下来我来介绍 gonew 的几种用法。

使用

用法1

用法1是基于模板创建同名项目,我们以 https://github.com/minio/mc 这个项目为例子。

执行 gonew github.com/minio/mc

1
2
$ gonew github.com/minio/mc
gonew: initialized github.com/minio/mc in .\mc

进入mc文件夹,查看 go.mod 文件,我们发现 gonew 仅是将模板项目下载到本地,且go module的名字也未被改变。这个用法适合本地创建某个项目的样例代码。

img.png

用法2

用法2是基于模板创建项目,但不保留 go module 的名字,使用新的 module 名字。我们同样使用mc这个项目。

执行 gonew github.com/minio/mc github.com/overstarry/mc

同样对创建的项目进行探索,可以发现新创建的这个项目的 go.mod 使用的是我们定义的go.mod。

img_1.png

这种用法应该是 gonew 最常用的用法。

小结

gonew 的出现简化了 go 创建项目的难度,并且基于一些符合Go最佳实践的项目模板,Go初学者可以快速得到好的布局的项目。公司和组织层面也可以通过定义专属Go模板来满足组织和公司的内部需要,提高go新项目的创建效率以及提升Go项目布局的标准化程度。

参考