繁体   English   中英

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

[英]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 并下载新的依赖项)。 但是有几种不同的情况会导致不同的版本选择:

  1. 如果存储库已没有选择启用模块,但已经被标记为有效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

  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一样正常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

+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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM