Golang代理及版本问题疑问解答

Golang代理及版本问题疑问解答 你好,我在测试 Goreleaser 的配置更改时,最终在 GitHub 上创建了一个新的测试标签和版本:v1.3.4

检查完最近的更改后,我删除了 GitHub 上的这个版本,但现在我注意到 pkg.go.dev 上仍然列出了 v1.3.4,而 GitHub 上已经没有了。

现在这种情况下会发生什么?

  1. 我直接推进到 v1.4.0 并从此继续?v1.3.4 在 GitHub 上已不存在,所以我不确定这会产生什么后果。Go 代理将始终保留 v1.3.4,这有点烦人。我猜这不会影响使用 go install user/repo@latest
  2. 我重新发布另一个 v1.3.4,但将其作为一个我会保留的实际版本,不过它将与 Go 代理中之前那个原始的 v1.3.4 不匹配。而且,日期也对不上。

以下是 GitHub 和代理模块的链接:


更多关于Golang代理及版本问题疑问解答的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

好的,明白了。我将发布 v1.4.0 版本。

更多关于Golang代理及版本问题疑问解答的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go 模块代理将标签视为不可变的。因此,为不同的提交重新推送 v1.3.4 版本是无效的。

你需要改为发布 v1.3.5(或 v1.4.0)版本。并且建议在你的 go.mod 文件中为那个非预期的 v1.3.4 版本添加一个 retract 指令。Go Modules 参考 - Go 编程语言

根据你的情况,这是Go模块代理的预期行为。一旦模块版本被代理(proxy.golang.org)收录,它就会永久保留,即使你从GitHub上删除了该版本。这是为了确保构建的可重现性。

当前情况分析

  1. 代理中的v1.3.4会永久存在 - 这是设计使然
  2. GitHub上可以重新创建v1.3.4 - 但会产生不匹配问题
  3. go install @latest会找到最新版本 - 不受已删除版本影响

推荐方案:直接推进到v1.4.0

这是最干净的做法。代理中的v1.3.4不会影响后续版本的使用。

// 用户仍然可以正常安装最新版本
go install github.com/digitalghost-dev/poke-cli[@latest](/user/latest)
// 这会安装v1.4.0(当你发布后)

// 如果有人确实指定了v1.3.4
go install github.com/digitalghost-dev/poke-cli@v1.3.4
// 这会从代理获取已缓存的版本

如果你需要修复v1.3.4

可以使用+incompatible标签或发布v1.3.5:

# 方法1:使用伪版本(不推荐)
go get github.com/digitalghost-dev/poke-cli@v1.3.5-0.20240101-commithash

# 方法2:发布v1.3.5作为修复版本
git tag v1.3.5
git push origin v1.3.5

验证当前状态

你可以检查模块在代理中的信息:

# 查看可用的版本
GOPROXY=direct go list -m -versions github.com/digitalghost-dev/poke-cli

# 查看特定版本的信息
go list -m github.com/digitalghost-dev/poke-cli@v1.3.4

重要注意事项

  1. 不要重新发布相同的v1.3.4 - 这会导致校验和不匹配错误
  2. 代理缓存是永久的 - 无法删除proxy.golang.org中的版本
  3. latest标签正常工作 - 它会找到GitHub上存在的最新版本

直接推进到v1.4.0是最佳选择。代理中遗留的v1.3.4不会对大多数用户造成影响,只有那些明确指定@v1.3.4的用户会从代理获取到旧版本。

回到顶部