go.mod中的'incompatible'是什么意思,会不会造成伤害?

What does 'incompatible' in go.mod mean, will it cause harm?

我在我的项目中使用 goczmq,如下所示:

main.go:

package main

import (
    _ "github.com/zeromq/goczmq"
)

func main() {
}

此外,我正在使用带有 gomod 的 golang 1.12 来管理我的项目。

看下,我用的是go mod init xxx,build的时候自动下载goczmq,然后添加依赖到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 时,会有在那里隐藏炸弹...?)

所以我的问题是:

我应该担心这个吗,还是正如预期的那样?

+incompatible 表示依赖项的 semver 主要版本为 2 或更高,并且还不是 Go 模块(它的源代码中没有 go.mod)。

采纳的答案是正确的,但是对于刚接触go module的我来说确实不友好。我根据答案做了一些调查,然后根据 this 得出结论,以防有人需要:

go build 或 go test 等标准命令将根据需要自动添加新的依赖项以满足导入(更新 go.mod 并下载新的依赖项)。但是有几种不同的情况会导致不同的版本选择:

  1. 如果存储库没有选择加入模块但已被标记为有效的 semver 标签,同时,它是 v0/v1 模块,请参阅 this:

    未选择加入模块:表示在源代码树

    中没有go.mod

    有效的 semver 标签:意味着回购使用 git 标签来标记为 vX.Y.Z

    v0/v1 module:表示主要版本(即X)的值为0或1,例如v0.1.0, v1.2.3

    然后,它将使用 pseudo-version,类似于 github.com/kolo/xmlrpc v0.0.0-20190717152603-07c4ee3fd181

  2. 如果存储库未选择加入模块但已标记有有效的 semver 标签,同时,它是 v2+ 模块,请参阅 this:

    v2+ module:表示主版本(即X)的值为>=2,例如。 v4.1.0

    然后,它将显示为incompatible,类似于github.com/zeromq/goczmq v4.1.0+incompatible

  3. 如果存储库已经选择加入模块,但尚未使用有效的 semver 标签进行标记:

    然后,它将表现为1,使用pseudo-version

  4. 如果存储库已经选择加入模块,并且已使用有效的 semver 标签进行标记,同时,它是一个 v0/v1 模块:

    然后,它会像 github.com/stretchr/testify v1.3.0

  5. 一样正常运行
  6. 如果存储库已经选择加入模块,并且已使用有效的 semver 标签进行标记,同时,它是 v2+ 模块:

    然后,在源代码中导入时,我们需要在末尾添加/vN,例如import "github.com/my/mod/v4",而在go.mod中,它的行为类似于github.com/my/mod/v4 v4.1.0

对于 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 文件中的模块名称。