go.mod中不兼容的内容会造成伤害吗?

时间:2019-08-05 09:41:38

标签: go go-modules

我在项目中使用goczmq,类似下一个内容:

main.go:

package main

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

func main() {
}

还有更多,我将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
)

通过一些讨论(针对其他库),例如this,看来图书馆所有者应该做些事情来支持golang 1.12?但是就我而言,一切正常,只是在incompatible那里让我有些担心(我的意思是,现在一切似乎都很好,但是有一天,当我使用从未使用过的api时,那里会藏有炸弹...?)

所以我的问题:

我应该为此担心吗,或者这与预期的一样?

3 个答案:

答案 0 :(得分:6)

接受的答案是正确的,但对于刚接触go模块的我来说确实不友好。如果有人需要,我会根据答案进行一些调查,然后基于this做出结论。

诸如go build或go test之类的标准命令将根据需要自动添加新的依赖关系,以实现导入(更新go.mod并下载新的依赖关系)。但是有几种不同的情况会导致选择不同的版本:

  1. 如果存储库未选择使用模块,但已使用有效的semver标签进行了标记,则它是v0 / v1模块,请参见this

    未选择使用模块:表示源树中没有go.mod

    有效的semver标签:表示存储库使用git标签将其标记为vX.Y.Z

    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 +模块,请参见this

    v2 +模块:表示主版本(即X)的值> = 2,例如g。 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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

对于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设置为direct或不承载此文件的其他服务器,则go get将会失败-

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                .AddJsonOptions(options => {
                    var resolver = options.SerializerSettings.ContractResolver;
                    if (resolver != null)
                        (resolver as DefaultContractResolver).NamingStrategy = null;
                });

            services.AddDbContext<PaymentDetailContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DevConnection"))); //Dependency Injection
            // options => options.UseSqlServer() Lamda Expression

            services.AddCors(options =>
            {
                options.AddPolicy(MyAllowSpecificOrigins,
                    builder =>
                    {
                        builder.WithOrigins("http://localhost:4200").AllowAnyHeader()
                                .AllowAnyMethod(); ;
                    });
            });

此处的“ 版本验证”部分下提到的更多详细信息-https://golang.org/doc/go1.13#modules

注意-GoSUMDB也不会包含此类条目,因此,即使将GOPROXY设置为承载此文件的服务器,并且启用了GOSumDB,也会得到类似的内容-

    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

正确的解决方案是跟进模块作者,以在模块名称后添加后缀,以确保他们正确地采用了Go模块。

有一种解决方法,但必须检查其是否按设计工作,即将GOPROXY指向承载此文件的服务器,然后使用GOPRIVATE从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.mod文件中。