Go modules 拉取旧版本的包

Go modules pulls old version of a package

我正在尝试使用 go modules 向我的项目添加一个新包。这个包正在使用 github.com/docker/docker/client 并且在项目之外工作正常。当我 运行 go mod vendor 它拉取 docker 版本 v1.13.1 的客户端包时,它没有我在我的代码中使用的一些方法,但是在 go modules它被标记为最新。我如何 mod 使用真正最新版本的软件包?

为了获得最新的未标记版本,您需要在执行 go get

时指定您想要的提交标记
go get github.com/docker/docker/client@[commit-hash]

Go Wiki: Modules:

When needed, more specific versions of dependencies can be chosen with commands such as go get foo@v1.2.3, go get foo@master, go get foo@e3702bed2, or by editing go.mod directly.

如果您需要 master 分支上的最新提交,请使用

go get github.com/docker/docker/client@master

建议使用特定版本(首选标记版本,如果不是最新的伪版本而不是主版本)。在 go.mod 文件中锁定依赖版本可确保可重复性。

其中一个 go 代理中可用的最新版本是 https://search.gocenter.io/github.com~2Fdocker~2Fdocker/info?version=v1.14.0-0.20190511020111-3998dffb806f

这也让我发疯:下载“master”或“latest”标签通常会下载 HEAD 之前一两个提交的版本。我找到了答案 here:

The go command defaults to downloading modules from the public Go module mirror at proxy.golang.org. It also defaults to validating downloaded modules, regardless of source, against the public Go checksum database at sum.golang.org. These defaults work well for publicly available source code.

显然正在进行一些缓存;如果您稍等片刻,它通常会开始工作,或者它有助于暂时将版本设置为特定提交。

为了修复它,我设置了 GOPRIVATE=github.com/myuser

花了最后 20 个小时试图解决类似的问题,就我而言,以下步骤解决了问题:

  1. 删除$GOPATH/pkg/sumdb
  2. 删除 go.mod 和 go.sum 文件
  3. 重新创建 module: go mod init name
  4. 去测试./...