Golang模块与更新库的使用指南

Golang模块与更新库的使用指南 我有一个使用第三方包的小测试程序。我使用的是 go1.13.1,没有设置 GOPATH 变量,但代码位于 ~/go/src 目录中。

我有一个包含以下内容的 go mod 文件:

module test-YYY

go 1.13

require github.com/XXX/go-YYY v0.0.0-20170629085401-919a10a449cc

另一个包中存在错误,我提交了一个拉取请求,刚刚被合并。因此现在有一个比我 go.mod 文件中指定的提交更新的提交。

我想使用该包的最新版本(已修复的版本),但 go get -u github.com/XXX/go-YYY 一直使用旧的库版本,并且由于错误无法编译。

我是否必须手动删除 go.mod 文件中的 require 行,还是有其他方法可以切换到该包的最新版本?

编辑:刚刚测试了手动删除 require 行,但 go get -u 仍然获取的是旧版本而不是最新版本。我无法让 go 使用最新且已修复的版本。


更多关于Golang模块与更新库的使用指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

回复我自己,因为我成功解决了这个问题。我仍然很好奇为什么 Go 语言声称使用了最新版本但实际上没有,希望有人能解释一下。

使用以下命令后问题得到解决:

go get -u github.com/XXX/go-YYY@latest

不确定是否必须使用 -u 参数。由于无法回退测试,所以无法验证不加该参数的情况。

更多关于Golang模块与更新库的使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Christophe_Meessen: 我也在使用 go1.13.1 且没有设置 GOPATH 变量,但代码位于 ~/go/src 目录中。

另外,是否有任何书面文档说明不再需要 GOPATH?我找不到关于 GOPATH 弃用状态的说明,而且安装指南仍然提到需要 GOPATH下载和安装 - Go 编程语言)。

根据我对(有些令人困惑的)文档的理解:

  1. 使用 Go 模块 - Go 编程语言
  2. 模块 · golang/go Wiki · GitHub

我认为它没有更新的主要原因是由于伪版本锁定在 v0.0.0-20170629085401-919a10a449cc。这解释了为什么当你使用 @latest 时,它会覆盖它(文档:模块 · golang/go Wiki · GitHub)。

Do I have to manually remove the require line in the go.mod file

我通常半自动地管理 go.mod。基本上,我会控制依赖关系以避免过去 go-bindata 的灾难。

另外,是否有任何书面文档说明不再需要 GOPATH

显然,在 go1.13.x 版本中,是否定义 GOPATH 已不再重要。唯一关键的是是否存在 go.mod 文件。

如果没有 go.mod 文件,则应用使用 GOPATH 或其默认路径(~/go)的旧系统。当存在 go.mod 文件时,则应用模块系统。

命令 go get -u github.com/XXX/go-YYY@latest 只能与模块系统一起使用。在模块系统中,go get 指令会获取所有包。这在旧的 GOPATH 系统中无法工作。我之前对 go get 行为的这种差异感到困惑。我不明白为什么它有时能工作。原因就在于是否存在 go.mod 文件。

Christophe_Meessen: 我之前对 go get 行为的这种差异感到困惑。我不理解为什么它有时有效。原来是 go.mod 文件的存在决定的。

明白了。太好了!

Christophe_Meessen: 显然,在 go1.13.x 中,是否定义 GOPATH 并不重要。只有 go.mod 文件的存在才是关键。

如果没有 go.mod 文件,则使用基于 GOPATH 或其默认值(~/go)的旧系统。当存在 go.mod 文件时,则应用模块系统。

找到了支持文档:SettingGOPATH · golang/go Wiki · GitHub。其中明确提到:

If no  `GOPATH`  is set, it is assumed to be  `$HOME/go`  on Unix systems and  `%USERPROFILE%\go`  on Windows.

这应该与所有关于 Go Modules 的文档一致,这些文档仍然严重依赖 GOPATH

  1. go command - cmd/go - Go Packages
  2. go command - cmd/go - Go Packages

所有点都连接起来了,我们可以“标记为已解决”。

在 Go 1.13 中,当使用 Go 模块时,go get -u 可能不会自动更新到最新提交,特别是对于没有语义版本标签的依赖项。以下是几种强制更新到最新提交的方法:

  1. 使用特定提交哈希
go get github.com/XXX/go-YYY@latest
  1. 手动指定最新提交
go get github.com/XXX/go-YYY@<最新提交哈希>
  1. 清理并重新获取
go clean -modcache
go get -u github.com/XXX/go-YYY
  1. 直接编辑 go.mod 文件
go mod edit -droprequire=github.com/XXX/go-YYY
go get github.com/XXX/go-YYY@latest

如果上述方法仍然获取旧版本,可能是由于代理缓存或版本标签问题。可以尝试:

GOPROXY=direct go get -u github.com/XXX/go-YYY

检查该仓库是否有新的版本标签:

go list -m -versions github.com/XXX/go-YYY

如果该包使用了语义版本控制,确保最新提交有对应的标签。对于没有标签的仓库,Go 会基于提交时间选择版本,可能需要明确指定最新提交。

示例操作流程:

# 查看当前版本
go list -m all | grep go-YYY

# 强制更新到最新
go get github.com/XXX/go-YYY@master

# 整理依赖
go mod tidy

# 验证版本
go list -m all | grep go-YYY

如果问题仍然存在,检查 go env 中的 GOPROXYGOSUMDB 设置,临时设置为直接模式可能有助于绕过缓存问题。

回到顶部