cmd/go: 'go get' with semantic-version prefix doesn't fall back to matching tag or branch

yruzcnhs  于 4个月前  发布在  Go
关注(0)|答案(8)|浏览(48)

你正在使用哪个版本的Go( go version )?

$ go version
go version go1.11.4 darwin/amd64

这个问题在最新版本中是否重现?

是的。

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GOARCH="amd64"
GOBIN="/Users/d.lopez/go/bin"
GOCACHE="/Users/d.lopez/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/d.lopez/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/Cellar/go/1.11.4/libexec"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.11.4/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/d.lopez/go/src/gitlab.mycompany.com/my-user/my-project/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/6n/q8wt03m13_x3w6v5__mzkwgc0000gn/T/go-build342969942=/tmp/go-build -gno-record-gcc-switches -fno-common"

你做了什么?

go get github.com/sideshow/apns2@v0.14

你期望看到什么?

尽管它没有有效的semver标签(补丁号缺失),但包 apns2 已成功添加到 go.mod 文件并使用伪版本或类似的东西下载到 pkg/mod

你看到了什么?

这个难以理解的错误(我花了几分钟才意识到缺少一个补丁版本)

go get github.com/sideshow/apns2@v0.14: no matching versions for query "v0.14"

解决方法

我找到的唯一解决方法是在所需仓库的 v0.14 标签内的最新提交SHA上进行固定。

gc0ot86w

gc0ot86w1#

这与 #33010 问题基本相同。
不幸的是,这种行为无论如何都会让人感到有些困惑:如果一个仓库有一个标签 v0.14 和一个标签 v0.14.1 ,而你运行 go get […]@v0.14 ,你应该得到该前缀的最高补丁版本( v0.14.1 )还是具有精确匹配文本的标签( v0.14 )?答案似乎并不明显。
总的来说,这应该只是一个过渡性问题:我们期望,向前发展,为 go 命令标记版本的人将使用完整的语义版本进行标记。
CC @jayconrod

cnh2zyt3

cnh2zyt32#

我认为这是一个更大的问题,对于分支来说。我认为人们很可能会命名主要或次要的发布分支,如v2v2.3
我想知道我们是否应该实际上放弃这些名称的查询功能?我的印象是大多数人不知道或者不使用它。获取其中一个分支的最新信息的能力对我来说似乎更有用。

iibxawm4

iibxawm43#

我支持放弃基于前缀的查询,转而支持分支名称。不过,也许可以将其作为一个单独的提案提交?

h79rfbju

h79rfbju4#

FWIW,我同意@jayconrod的#29731(评论)将查询前缀改为更好地支持分支名称。我认为这是一个净收益,并且更好地符合人们对常见情况下发生的事情的直觉。
两个相关的评论:

  1. 对于一个模块,能够使用@v2作为前缀并不是那么有用,因为你需要在模块路径的末尾有/v2
  2. 你目前也可以使用go get 'foo@>=v1.3',这与使用v1.3作为前缀几乎具有相同的功能。(我怀疑大约相同数量的gophers知道这两个中的每一个,也就是说,可能大多数gophers目前都不知道其中一个)。它们的功能并不完全相同,包括在这个例子中,如果有一个角落情况存在v1.4.0版本但没有v1.3.x版本(尽管我认为这个特定的角落情况可能是违反了semver规范)。在实践中,它们可能足够接近以解决类似的用例,从而减轻使用前缀的损失。
hec6srdp

hec6srdp5#

同意。我认为我们将尝试将其切换到1.14版本。

wmvff8tz

wmvff8tz6#

这并没有达到1.14版本。我们或许可以在1.15版本中再次尝试。

i7uaboj4

i7uaboj47#

在go1.17中,go get已被弃用,将打印出明确的错误信息。

$ gotip version
go version devel go1.22-1e69040920 Fri Sep 29 22:29:16 2023 +0000 windows/amd64

$ gotip get github.com/sideshow/apns2@v0.14
go: go.mod file not found in current directory or any parent directory.
        'go get' is no longer supported outside a module.
        To build and install a command, use 'go install' with a version,
        like 'go install example.com/cmd@latest'
        For more information, see https://golang.org/doc/go-get-install-deprecation
        or run 'go help get' or 'go help install'.

缺少补丁号触发了一条关于格式的消息,但没有提到补丁级别,这似乎是合适的:

$ gotip install github.com/sideshow/apns2@v0.14
go: github.com/sideshow/apns2@v0.14: no matching versions for query "v0.14"

问题似乎已经解决。

ctehm74n

ctehm74n8#

这仍然在模块内重现:

$ go version
go version devel go1.22-8c3924c6 Fri Sep 29 09:00:12 2023 +0000 linux/amd64

$ go mod init example
go: creating new go.mod: module example

$ go get github.com/sideshow/apns2@v0.14
go: github.com/sideshow/apns2@v0.14: no matching versions for query "v0.14"

相关问题