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

时间:2019-12-27 05:44:50

标签: go go-modules

我现在正在使用golang 1.13并使用go模块。

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

https://tip.golang.org/cmd/go/#hdr-Module_downloading_and_verification)。

但是该软件包不是模块,因此没有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=

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

3 个答案:

答案 0 :(得分:0)

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

每个包/模块都是依赖项,每个依赖项都意味着要与go.sum中的校验和一起维护,因此无论是包还是模块,都将被维护。

相应地,源将下载到$GOPATH/src目录中。

尝试-

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

func (r *codeRepo) legacyGoMod(rev, dir string) []byte {
    // We used to try to build a go.mod reflecting pre-existing
    // package management metadata files, but the conversion
    // was inherently imperfect (because those files don't have
    // exactly the same semantics as go.mod) and, when done
    // for dependencies in the middle of a build, impossible to
    // correct. So we stopped.
    // Return a fake go.mod that simply declares the module path.
    return []byte(fmt.Sprintf("module %s\n", modfile.AutoQuote(r.modPath)))
}

此处的代码:https://github.com/golang/go/blob/acac535c3ca571beeb168c953d6d672f61387ef1/src/cmd/go/internal/modfetch/coderepo.go#L857

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

  1. 找到cmd/go/internal/modfetch/coderepo.go,向函数legacyGoMod添加一个断点
  2. 找到cmd/go/internal/modfetch/coderepo_test.go,按F5
  3. 稍等片刻,在断点处停下

VSCode debug Golang source code