[英]Get latest version in go.mod if one of the requires is +incompatible
[英]What does 'incompatible' in go.mod mean, will it cause harm?
我在我的项目中使用goczmq ,如下所示:
main.go:
package main
import (
_ "github.com/zeromq/goczmq"
)
func main() {
}
而且,我使用 golang 1.12 和 gomod 来管理我的项目。
看接下来,我使用go mod init xxx
,在构建时,它会自动为我下载 goczmq 并将依赖go.mod
添加到go.mod
,但其中incompatible
。 (但对于其他库,我可能会得到类似github.com/kolo/xmlrpc v0.0.0-20190717152603-07c4ee3fd181
东西)
go.mod:
module pigeon
go 1.12
require (
github.com/zeromq/goczmq v4.1.0+incompatible
)
从一些讨论(对于其他图书馆),例如this ,图书馆所有者似乎应该做些什么来支持 golang 1.12? 但在我的情况下,一切正常,只是incompatible
让我有点担心(我的意思是现在一切正常,但是有一天当我使用我以前从未使用过的 api 时,那里会有隐藏的炸弹......? )
所以我的问题:
我应该担心这个,还是正如预期的那样?
接受的答案是正确的,但对刚接触 go 模块的我来说真的不友好。 我根据答案进行了一些调查,并在此基础上得出结论,以防万一有人需要:
go build 或 go test 等标准命令将根据需要自动添加新的依赖项以满足导入(更新 go.mod 并下载新的依赖项)。 但是有几种不同的情况会导致不同的版本选择:
如果存储库已没有选择启用模块,但已经被标记为有效semver标签,同时,它的V0 / V1模块,看看这个:
未选择加入模块:意味着源树中没有go.mod
有效的 semver 标签:意味着 repo 使用 git 标签来标记为类似vX.YZ
东西
v0/v1 模块:表示主要版本(即 X)的值为 0 或 1,例如 v0.1.0、v1.2.3
然后,它将使用一个pseudo-version
,比如github.com/kolo/xmlrpc v0.0.0-20190717152603-07c4ee3fd181
如果存储库已没有选择启用模块,但已经被标记为有效semver标签,同时,这是一个V2 +模块,看看这个:
v2+ 模块:表示主要版本(即 X)的值 >=2,例如。 v4.1.0
然后,它将显示为incompatible
,类似于github.com/zeromq/goczmq v4.1.0+incompatible
如果存储库已选择加入模块,但尚未使用有效的 semver 标签进行标记:
然后,它将表现为 1,使用pseudo-version
。
如果存储库已经选择加入模块,并且已使用有效的 semver 标签进行标记,同时,它是一个 v0/v1 模块:
然后,它会像github.com/stretchr/testify v1.3.0
一样正常github.com/stretchr/testify v1.3.0
如果存储库已经选择加入模块,并且已使用有效的 semver 标签进行标记,同时,它是一个 v2+ 模块:
然后,当在源代码中导入时,我们需要在末尾添加/vN
,例如, import "github.com/my/mod/v4"
,在go.mod
它将表现得像github.com/my/mod/v4 v4.1.0
+incompatible
意味着该依赖项的 semver 主要版本为 2 或更高,并且还不是 Go 模块(它的源代码中没有 go.mod)。
对于 v4 及更高版本(v4.1.0、v4.2.0 等),模块名称应该是 github.com/zeromq/goczmq/v4 而不是github.com/zeromq/goczmq 。
由于 github.com/zeromq/goczmq 没有正确采用 Go 模块,如果使用 Go 1.13 并且 GOPROXY 设置为直接或其他不托管此文件的服务器,则 go get 将失败 -
go get github.com/zeromq/goczmq@v4.2.0+incompatible
go: finding github.com v4.2.0+incompatible
go: finding github.com/zeromq v4.2.0+incompatible
go: finding github.com/zeromq/goczmq v4.2.0+incompatible
go: finding github.com/zeromq/goczmq v4.2.0+incompatible
go get github.com/zeromq/goczmq@v4.2.0+incompatible: github.com/zeromq/goczmq@v4.2.0+incompatible: invalid version: +incompatible suffix not allowed: module contains a go.mod file, so semantic import versioning is required
在此处的“版本验证”部分中提到的更多详细信息 - https://golang.org/doc/go1.13#modules
注意 - GoSUMDB 也不会有这样的条目,所以即使您将 GOPROXY 设置为托管此文件的服务器并且如果启用了 GOSumDB,您也会得到类似的信息 -
➜ ~ export GOPROXY=https://gocenter.io
➜ ~ go get github.com/zeromq/goczmq@v4.2.0+incompatible
go: finding github.com/zeromq/goczmq v4.2.0+incompatible
go: finding github.com/zeromq v4.2.0+incompatible
go: finding github.com v4.2.0+incompatible
go: downloading github.com/zeromq/goczmq v4.2.0+incompatible
verifying github.com/zeromq/goczmq@v4.2.0+incompatible: github.com/zeromq/goczmq@v4.2.0+incompatible: reading https://gocenter.io/sumdb/sum.golang.org/lookup/github.com/zeromq/goczmq@v4.2.0+incompatible: 404 Not Found
正确的解决方案是跟进模块作者,通过向模块名称添加后缀来确保他们正确采用 Go 模块。
有一种解决方法,但必须检查它是否按设计工作,即将 GOPROXY 指向托管此文件的服务器,然后使用 GOPRIVATE 从 GoSumDB 验证中排除此特定模块版本 -
root@715c3b39bb12:/go# export GOPROXY=https://gocenter.io
root@715c3b39bb12:/go# unset GOPRIVATE
root@715c3b39bb12:/go# go get github.com/zeromq/goczmq@v4.2.0+incompatible
go: finding github.com v4.2.0+incompatible
go: finding github.com/zeromq/goczmq v4.2.0+incompatible
go: finding github.com/zeromq v4.2.0+incompatible
go: downloading github.com/zeromq/goczmq v4.2.0+incompatible
verifying github.com/zeromq/goczmq@v4.2.0+incompatible: github.com/zeromq/goczmq@v4.2.0+incompatible: reading https://gocenter.io/sumdb/sum.golang.org/lookup/github.com/zeromq/goczmq@v4.2.0+incompatible: 404 Not Found
root@715c3b39bb12:/go# export GOPRIVATE=github.com/zeromq/goczmq
root@715c3b39bb12:/go# go get github.com/zeromq/goczmq@v4.2.0+incompatible
go: downloading github.com/zeromq/goczmq v4.2.0+incompatible
go: extracting github.com/zeromq/goczmq v4.2.0+incompatible
# pkg-config --cflags -- libczmq libzmq libsodium
Package libczmq was not found in the pkg-config search path.
Perhaps you should add the directory containing `libczmq.pc'
但是,仍然建议联系模块作者以在他们的 go.mod 文件中修复模块名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.