我现在正在使用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=
我的问题是,第二行是如何生成的?
答案 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)))
}
↓VSCode打开/usr/local/go/src
:
cmd/go/internal/modfetch/coderepo.go
,向函数legacyGoMod
添加一个断点cmd/go/internal/modfetch/coderepo_test.go
,按F5