每个 subcommand 的含义如下:
-
download: 下载 modules 到本地缓存
-
edit: 提供一种命令行交互修改 go.mod 的方式
-
graph: 将 module 的依赖图在命令行打印出来,其实并不是很直观
-
init: 初始化 modules,会生成一个 go.mod 文件
-
tidy: 清理 go.mod 中的依赖,会添加缺失的依赖,同时移除没有用到的依赖
-
vendor: 将依赖包打包拷贝到项目的 vendor 目录下,值得注意的是并不会将 test code 中的依赖包打包到 vendor 中。这种设计在社区也引起过几次争论,但是并没有达成一致。
-
verify: verify 用来检测依赖包自下载之后是否被改动过。
-
why: 解释为什么 package 或者 module 是需要,但是看上去解释的理由并不是非常的直观。
? mod-demo $ gomod why github.com/astaxie/beego
# github.com/astaxie/beego
mod-demo
github.com/astaxie/beego
3. Go 1.13 对 modules 的改动
上面在讨论 GoProxy 的时候提到了 Go 1.13 默认设置环境变量 GOPROXY 的值,除此之外 Go 1.13 对 modules 还有哪些值得注意的改动呢?
3.1 默认开启
modules 在 Go 1.13 的版本下是默认开启的。
3.2 GOPRIVATE
前面也说到对于一些内部的 package,GoProxy 并不能很好的处理,Go 1.13 推出了 GOPRIVATE 机制。只需要设置这个环境变量,然后标识出哪些 package 是 private 的,那么对于这个 package 的处理将不会从 proxy 下载。GOPRIVATE 的值是一个以逗号分隔的列表,支持正则(正则语法遵守 Golang 的 包 path.Match)。下面是一个 GOPRIVATE 的示例:
GOPRIVATE=*.corp.example.com,rsc.io/private
上面的 GOPRIVATE 表示以 *.corp.example.com 或者 rsc.io/private 开头的 package 都是私有的。
3.3 GOSUMDB
GOSUMDB 的全称为 Go CheckSum Database,用来下载的包的安全性校验问题。包的安全性在使用 GoProxy 之后更容易出现,比如我们引用了一个不安全的 GoProxy 之后然后下载了一个不安全的包,这个时候就出现了安全性问题。对于这种情况,可以通过 GOSUMDB 来对包的哈希值进行校验。当然如果想要关闭哈希校验,可以将 GOSUMDB 设置为 off;如果要对部分包关闭哈希校验,则可以将包的前缀设置到环境变量中 GONOSUMDB 中,设置规则类似 GOPRIVATE。
关于 GOSUMDB 的配置格式为:<db_name>+<publickey>+<url>。
GOSUMDB="sum.golang.org"
GOSUMDB="sum.golang.org+<publickey>"
GOSUMDB="sum.golang.org+<publickey> https://sum.golang.org"
上面三种配置都是合理的,因为对于 sum.golang.org,Go 自己知道其对应的 publickey 和 url,所以我们只要配置一个名字即可,对于另外一个 sum.golang.google.cn 也是一样。除此之外的,都需要指明 publickey,url 默认是 https://<db_name>。
关于 GOSUMDB 更多的详细信息可以参考:https://golang.org/cmd/go/#hdr-Module_authentication_failures
4. 总结
Golang 包管理历经多个版本,目前来看并没有一个完全让开发者满意的方案,比如类似 Java 的 maven 的包管理方式。很多开发者也表示 modules 的管理方式也不是很直观。其实 Golang 的 package 使用 git 的管理方式来管理其实是一个很好的管理方式,我们最需要的其实如何能让普通开发者获取到任何 package 的心智负担降到最低。值得欣慰的是我们确实有看到大家在这个方向上的努力,比如 modules 的 GoProxy。
放眼未来,希望会有一种令大部分普通开发者满意的包管理方式吧。
5. Reference
-
https://research.swtch.com/vgo
-
https://github.com/golang/go/wiki/Modules
-
https://roberto.selbach.ca/intro-to-go-modules/
-
https://roberto.selbach.ca/playing-with-go-modules/
-
https://semver.org/
-
https://golang.org/cmd/go/#hdr-Module_authentication_failures
-
https://golang.org/doc/go1.13#modules
-
https://goproxy.io
-
https://github.com/goproxy/goproxy.cn
-
https://codeengineered.com/blog/2018/golang-godep-to-vgo/