go.mod 中的“不兼容”是什么意思,会造成伤害吗?

atl*_*ine 70 go go-modules

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

main.go:

package main

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

func main() {
}
Run Code Online (Sandbox Code Playgroud)

而且,我使用 golang 1.12 和 gomod 来管理我的项目。

看接下来,我使用go mod init xxx,并且在构建时,它会自动为我下载 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
)
Run Code Online (Sandbox Code Playgroud)

从一些讨论(对于其他图书馆),例如this,图书馆所有者似乎应该做些什么来支持 golang 1.12?但在我的情况下,一切正常,只是incompatible让我有点担心(我的意思是现在一切都很好,但是有一天当我使用我以前从未使用过的 api 时,那里会有隐藏的炸弹......?)

所以我的问题:

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

atl*_*ine 84

接受的答案是正确的,但对刚接触 go 模块的我来说真的不友好。我根据答案进行了一些调查,并在基础上得出结论,以防万一有人需要:

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

  1. 如果存储库已没有选择启用模块,但已经被标记为有效semver标签,同时,它的V0 / V1模块,看看这个

    未选择加入模块:意味着go.mod在源树中没有

    有效的 semver 标签:意味着 repo 使用 git tag 来标记为类似的东西vX.Y.Z

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

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

  2. 如果存储库已没有选择启用模块,但已经被标记为有效semver标签,同时,这是一个V2 +模块,看看这个

    v2+ 模块:表示主要版本(即 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. 如果存储库已经选择加入模块,并且已使用有效的 semver 标签进行标记,同时,它是一个 v2+ 模块:

    然后,当进口在源代码中,我们需要添加/vN底,例如import "github.com/my/mod/v4",在go.mod它会像github.com/my/mod/v4 v4.1.0

  • 不需要物理文件夹。举个例子:这个项目https://github.com/etcd-io/etcd/blob/master/go.mod#L9需要使用`github.com/coreos/go-systemd/v22 v22.0.0`,但接下来是项目“coreos”:https://github.com/coreos/go-systemd,您可以看到它没有文件夹“v22.0.0”,只需在模块名称中包含它:https://github .com/coreos/go-systemd/blob/master/go.mod#L1 (2认同)

owl*_*lks 55

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

  • 我已编辑 anser 以包含 `+incompativle` 仅用于 v2+。它是不兼容的,因为如果“正确的”Go 模块是“v4.1.0”,则模块名称中会有 …`/v4`。 (3认同)
  • 另请参阅 https://github.com/golang/go/wiki/Modules#can-a-module-consume-a-v2-package-that-has-not-opted-into-modules-what-does-inknown-意思是 (2认同)
  • 这会在未来造成任何问题吗?如果 go.mod 不存在? (2认同)

Ank*_*dha 5

The module name should have been github.com/zeromq/goczmq/v4 instead of github.com/zeromq/goczmq for versions v4 and above (v4.1.0, v4.2.0, etc).

Since github.com/zeromq/goczmq has not adopted Go modules correctly, the go get will fail if Go 1.13 is used and the GOPROXY is set to direct or to some other server that does not host this file -

    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

Run Code Online (Sandbox Code Playgroud)

More details mentioned under the 'Version validation' section here - https://golang.org/doc/go1.13#modules

Note - GoSUMDB also won't have such entries so even if you set the GOPROXY to a server that hosts this file and if GOSumDB is enabled, then you will get something like this -

    ?  ~ 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

Run Code Online (Sandbox Code Playgroud)

The correct solution will be to follow up with the module author to make sure that they are adopting Go modules correctly by adding a suffix to the module name.

There is a workaround but have to check if it's working by design i.e. point GOPROXY to a server that hosts this file and then use GOPRIVATE to exclude this specific module version from GoSumDB validation -


    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'

Run Code Online (Sandbox Code Playgroud)

However, will still recommend reaching out to the module author to fix the module name in their go.mod file.