一段时间前,我创建了一个新的仓库(github.com/go-quicktest/qt),它是旧仓库(github.com/frankban/quicktest)的一个分支,但具有新的主版本和模块路径。在某个时刻,旧仓库的标签意外地推送到了新仓库,尽管它们已经被删除。这些旧的标记版本在新仓库中都不可用,因为它们中所有声明的模块路径与模块的导入路径不匹配。
到目前为止,我们只故意发布了新模块的两个版本(v0.0.1
和 v0.0.2
)。
Pkgsite 只显示这两个版本,正如我们所希望的那样:
然而, cmd/go
也看到了一些旧的无效版本:
$ go list -m -versions github.com/go-quicktest/qt
github.com/go-quicktest/qt v0.0.1 v0.0.2 v1.3.0 v1.7.0 v1.9.0 v1.14.1 v1.14.2
这意味着 go get github.com/go-quicktest/qt
将失败,因为它看到的“最新”版本是一个无效版本。
在这一点上,我们 本可以发布撤回早期无效版本的 v1.15.0
,但那并不理想,因为我们还没有准备好稳定 API(而且我们绝对不希望在从未有过可行版本的情况下转移到 v2
)。
如果模块缓存能够避免缓存导入路径与声明的模块路径不匹配的版本,或者反过来,如果 go
导入逻辑能够避免考虑具有不匹配的版本,那就太好了。
据我了解,这里的主要问题是 replace
指令,实际上一个模块声明一个路径,而该路径并非其所找到的路径是合法的,但这是一个不寻常的情况,我怀疑人们通常会用一个明确已知的版本替换它,而不是使用 go get
,所以也许可以避免列出具有不匹配模块路径的版本。
3条答案
按热度按时间ut6juiuv1#
AFAICS,这里的主要问题是
replace
指令,实际上模块声明的路径与它在仓库中找到的路径不匹配。这是正确的。但确定模块路径不匹配至少需要下载
go.mod
文件,而go list -versions
在列出仓库中找到的 N 个版本时故意不会获取 O(N) 个文件——在大多数情况下,这将是不必要的昂贵操作。我建议你发布一个
v1.15.0
,撤销之前的版本和自身,留下v0.0.1
和v0.0.2
作为最早的非撤销版本——这是否适用于你的用例?juzqafwq2#
这是否真的可能自我缩回?这是一个有趣的想法!我会尝试一下(以后是否可以再次发布相同的版本,但使用不同的提交?)
但是确定模块路径不匹配至少需要下载go.mod文件,
我猜代理可能会缓存并提供一些来自go.mod文件的元数据(包括声明的模块路径),但从你所说,我想这不是情况。
li9yvcax3#
将来是否可以再次发布这些相同版本,但使用不同的提交?
不,sumdb将呈现一个安全错误。