01介绍

Golang 1.16 已经正式发布了,其中 Modules 有一些变化:

  • 默认开启 Modules。
  • 不自动修改 go.mod 和 go.sum。
  • 通过指定 @version 后缀安装特定版本可执行文件。
  • 新增 retract 指令撤回 Module 版本。
  • 使用新增配置变量 GOVCS 指定特定模块使用特定版本控制工具。
go.modmodule-aware
GO111MODULEGOPATHGO111MODULEautogo.modmodule-awarego env -wGO111MODULE

goenv-wGO111MODULE=auto

Go 1.17GOPATHGo 1.17GO111MODULEmodule-awaremodule-aware

03不自动修改go.mod和go.sum

go.modgo.sumrequiresumgo list
module-awarego.modgo.sum

$ go build
example.go:3:8: no required module provides package golang.org/x/net/html; to add it:
 go get golang.org/x/net/html
$ go get golang.org/x/net/html
$ go build
vendorvendorgo getgo mod tidygo.modgo.sum

04通过指定@version后缀安装特定版本可执行文件

go install@version

go install golang.org/x/tools/gopls@v0.6.5
@versiongo installgo.mod
@versiongo installgo.mod
go install program@latestreplaceexcludego install program@versiongo get

05新增retract指令撤回 Module 版本

proxy.golang.org
go.modretract@latestgo getgo list -m -u
example.com/libgo.mod

//Remote-triggeredcrashinpackagefoo.SeeCVE-2021-01234.
retractv1.0.5

接下来,作者可以 tag 和 push 版本 v1.0.6,新的最高版本。在此之后,已依赖 v1.0.5 的用户在检查更新或升级依赖包时将收到撤回通知。通知消息可能包括收回指令上方注释的文本。例如:

$ go list -m -u all
example.com/lib v1.0.0 (retracted)
$ go get .
go: warning: example.com/lib@v1.0.5: retracted by module author:
 Remote-triggered crash in package foo. See CVE-2021-01234.
go: to switch to the latest unretracted version, run:
 go get example.com/lib@latest

06使用新增配置变量 GOVCS 指定特定模块使用特定版本控制工具

proxy.golang.org

Go 1.16 引入了一个新的配置变量 GOVCS,它允许用户指定哪些模块允许使用特定的版本控制工具。GOVCS 接受一个逗号分隔的模式列表:vcslist 规则。

path.Match

GOVCS=github.com:git,evil.com:off,*:git|hg
github.comevil.com*

如果未设置环境变量 GOVCS,或者如果模块与任何模式不匹配,Go 命令将使用 GOVCS 的默认值:允许 git 和 hg 用于公共模块,并且允许所有工具用于私有模块。

设置只允许使用 Git 和 Mercurial 的理由是,这两个版本控制工具最关注作为不受信任服务器的客户端运行的问题。相比之下,Bazaar、Fossil 和 Subversion 主要用于受信任的、经过验证的环境中,而且没有像 attack surfaces 那样受到很好的审查。即默认设置为:

GOVCS=public:git|hg,private:all

07Module 未来发展

我们希望您发现这些功能很有用。我们已经开始开发 Go 1.17 的模块功能,特别是懒惰的模块加载,这应该使模块加载过程更快,更稳定。

08总结

GOPATH