为什么我使用golang模块,并导入模块中未选择的模块,但go.sum文件具有go.mod文件哈希?

为什么我使用golang模块,并导入模块中未选择的模块,但go.sum文件具有go.mod文件哈希?,go,go-modules,Go,Go Modules,我现在使用的是golang 1.13和go模块 然而,当我导入一个在go模块中选择了而不是的包(例如,a)时,在go.sum文件中仍然有两行。Go模块告诉我们“每个已知的模块版本在Go.sum文件中产生两行。第一行给出模块版本的文件树的散列。第二行在版本后面附加“/Go.mod”,并给出模块版本的散列(可能是合成的)go.mod文件。go.mod-only散列允许下载和验证模块版本的go.mod文件,这是计算依赖关系图所需的文件,而无需下载所有模块的源代码。” () 但是这个包不是一个模块,所以

我现在使用的是golang 1.13和go模块

然而,当我导入一个在go模块中选择了而不是的包(例如,a)时,在go.sum文件中仍然有两行。Go模块告诉我们“每个已知的模块版本在Go.sum文件中产生两行。第一行给出模块版本的文件树的散列。第二行在版本后面附加“/Go.mod”,并给出模块版本的散列(可能是合成的)go.mod文件。go.mod-only散列允许下载和验证模块版本的go.mod文件,这是计算依赖关系图所需的文件,而无需下载所有模块的源代码。”

()

但是这个包不是一个模块,所以它没有go.mod文件?例如,如果我在go.sum文件中导入不是模块的包调用“github.com/example/a”,它仍然有以下两行:

github.com/example/a v0.0.0-20190627063042-31896c4e4162 h1:rSqi2vQEpS+GAFKrLvmxzWW3OGlLI4hANnEf/ib/ofo=

github.com/example/a v0.0.0-20190627063042-31896c4e4162/go.mod h1:tcpxll8wcruwpPpWBbjAsWc1JbLHld/v9F+3rgLIr4c=

我的问题是,第二行是如何生成的?

go.sum
包含预期的加密校验和 特定模块版本的内容。每次创建依赖项时 使用时,如果缺少或需要匹配,其校验和将添加到go.sum go.sum中的现有条目

每个包/模块都是依赖项,每个依赖项都意味着要在
go.sum
中使用校验和进行维护,因此无论是包还是模块,都要进行维护

源代码将相应地下载到
$GOPATH/src
目录中


TRY-

go.sum
包含预期的加密校验和 特定模块版本的内容。每次创建依赖项时 使用时,如果缺少或需要匹配,其校验和将添加到go.sum go.sum中的现有条目

每个包/模块都是依赖项,每个依赖项都意味着要在
go.sum
中使用校验和进行维护,因此无论是包还是模块,都要进行维护

源代码将相应地下载到
$GOPATH/src
目录中


TRY-

将原因写入
go.sum
文件,每个依赖项和散列都会写入。与您的
go.mod
文件相关的文件,以及从您导入的模块导入的文件。尝试运行
go mod tidy
以减少导入的模块,您的
go.mod
文件将包含一些导入模块内部使用的
//间接导入。

导致在
go.sum
文件中写入每个依赖项和散列。与您的
go.mod
文件相关的文件,以及从您导入的模块导入的文件。尝试运行
go mod tidy
以减少导入的模块,您的
go.mod
文件将包含一些导入模块内部使用的
//间接导入。

可能Golang源代码可以解释原因:

func(r*codeRepo)legacyGoMod(rev,dir字符串)[]字节{
//我们曾经尝试构建一个go.mod来反映现有的
//包管理元数据文件,但转换
//本质上是不完美的(因为这些文件没有
//与go.mod的语义完全相同)和
//用于构建中的依赖关系,不可能
//对,所以我们停下来。
//返回一个伪go.mod,它只声明模块路径。
返回[]字节(fmt.Sprintf(“模块%s\n”,modfile.AutoQuote(r.modPath)))
}
此处的代码:

↓ VSCode打开
/usr/local/go/src

  • 定位到
    cmd/go/internal/modfetch/coderepo.go
    ,将断点添加到func
    legacyGoMod
  • 定位到
    cmd/go/internal/modfetch/coderepo\u test.go
    ,按F5
  • 请稍候,在断点处停止

  • 也许Golang源代码可以解释原因:

    func(r*codeRepo)legacyGoMod(rev,dir字符串)[]字节{
    //我们曾经尝试构建一个go.mod来反映现有的
    //包管理元数据文件,但转换
    //本质上是不完美的(因为这些文件没有
    //与go.mod的语义完全相同)和
    //用于构建中的依赖关系,不可能
    //对,所以我们停下来。
    //返回一个伪go.mod,它只声明模块路径。
    返回[]字节(fmt.Sprintf(“模块%s\n”,modfile.AutoQuote(r.modPath)))
    }
    
    此处的代码:

    ↓ VSCode打开
    /usr/local/go/src

  • 定位到
    cmd/go/internal/modfetch/coderepo.go
    ,将断点添加到func
    legacyGoMod
  • 定位到
    cmd/go/internal/modfetch/coderepo\u test.go
    ,按F5
  • 请稍候,在断点处停止

  • 但第二行是模块版本的go.mod文件的散列。如果它只是一个在go模块中未选择的普通包,则表示此包没有go.mod文件。那个么如何计算这个包的“go.mod文件”的散列呢?但第二行是模块版本的go.mod文件的散列。如果它只是一个在go模块中未选择的普通包,则表示此包没有go.mod文件。那个么如何计算这个包的“go.mod文件”的散列呢?但第二行是模块版本的go.mod文件的散列。如果它只是一个在go模块中未选择的普通包,则表示此包没有go.mod文件。那个么如何计算这个包的“go.mod文件”的散列呢?但第二行是模块版本的go.mod文件的散列。如果它只是一个在go模块中未选择的普通包,则表示此包没有go.mod文件。那么如何计算这个包的“go.mod file”的散列呢?